The assailants arrived aboard a vessel with Libyan coastguard insignia, and beat the migrants with clubs, sending many of them into the water, a Sea-Watch spokesman said.
The group said the Italian coastguard had sent a Seawatch rescue ship and a diverted oil tanker to help a dinghy in distress in international waters, 14 nautical miles off Libya, early on Friday.
As the operation was unfolding, assailants arrived aboard a vessel with Libyan coastguard insignia and tried to steal the dinghy's motor, a spokesman for Sea-Watch said.
The men, who spoke only Arabic, beat some of the migrants with clubs, causing panic which caused most of them to fall into the sea, the spokesman said.
Sea-Watch said it had rescued 120 out of the estimated 150 people onboard. Its team recovered four bodies but saw other corpses in the water that could not be retrieved. They estimate that between 15 and 25 are missing, the group said.
The Italian coastguard confirmed that the rescue vessel SeaWatch2 rescued 120 people before dawn on Friday, but gave no further details.
According to the UN, at least 3,654 people have died trying to cross the Mediterranean this year.
Attempts at the dangerous crossing are continuing despite worsening weather as winter approaches, with more than 2,400 migrants rescued off Libya in total since Sunday.
The Italian interior ministry said Tuesday that more than 145,000 migrants had landed in Italy so far this year, a figure similar to that of the previous two years.