Raycast apears to be using last RaycastHit

Whenever I use this Fire function it seems to return the last RaycastHit.

void Fire () {
		for (int i = 0; i < amountOfRays; i++) {

			animator.SetTrigger ("Fire");
			audio.PlayOneShot (fireSound);

			RaycastHit hit;
			if (Physics.Raycast (cameraTransform.position, cameraTransform.forward, out hit, distance, 1 << LayerMask.NameToLayer ("Environment"))) {

				Debug.Log ("hit");

				GameObject go = (GameObject)Resources.Load("BulletCollisionDefault");
				Instantiate (go);
				go.transform.position = hit.point;
				go.transform.rotation = Quaternion.FromToRotation(-go.transform.forward, hit.normal) * go.transform.rotation;

any help would be much appreciated.

Your raycasting is fine, the problem lies in the instantiation code.

Your last 4 lines are as follows:

Load a prefab
Instantiate the prefab
Set the position of the prefab (not the instance)
Set the rotation of the prefab (again, not the instance)

The quick solution is to add "go = " at the start of the instantiate line.

A cleaner, more readable solution would be:

// Load using the generic version of the function rather than casting the result.
GameObject prefab = Resources.Load<GameObject>("BulletCollisionDefault");
// Instantiate and score the new instance.
GameObject go = Instantiate (prefab) as GameObject;
// Set the position of the instance.
go.transform.position = hit.point;
// Multiply the rotation of the instance (note the *= instead of multiplying by rotation at the end; same result, but easier to read).
go.transform.rotation *= Quaternion.FromToRotation(-go.transform.forward, hit.normal);

Obviously you should remove those comments if you copy this into your code.