One way is the use of the Players mouse and to assign the Objects (Or Bullet Hole) position by using Mouse.Hit.p via a RemoteEvent if you want it visible to people
Yes, it is possible to create bullet holes using CFrames. One way to do this would be to use a CFrame to position and orient the bullet hole at the point of impact.
Here is an example of how you can do this:
When the bullet hits a player or wall, use the CFrame.new function to create a CFrame that represents the position and orientation of the bullet hole. You can use the position and normal vector of the point of impact to determine the position and orientation of the CFrame.
Use the SetPrimaryPartCFrame function to set the CFrame of the bullet hole model or part to the CFrame you created in step 2. This will position and orient the bullet hole at the point of impact.
Here is an example of how you could use these steps to create a bullet hole when a bullet hits a player:
local bullet = script.Parent -- the bullet that hit the player
local bulletHole = script.BulletHole -- the model or part that represents the bullet hole
local player = bullet.Parent -- the player that was hit
-- Get the position and normal vector of the point of impact
local impactPosition = bullet.Position
local impactNormal = (impactPosition - player.PrimaryPart.Position).Unit
-- Create a CFrame for the bullet hole
local bulletHoleCFrame = CFrame.new(impactPosition, impactPosition + impactNormal)
-- Set the CFrame of the bullet hole model or part
bulletHole.PrimaryPart.CFrame