Elias' double - one goal either side of half-time - put the visitors in the ascendancy and ultimately proved decisive despite Cicero halving the deficit midway through the second period.
The result got Botafogo back within four points of pace-setters Cruzeiro, who beat Atletico Paranaense 1-0 on Saturday night, after 21 games.
Elsewhere on Sunday, third-placed Gremio lost ground as a 62nd-minute Fernandinho strike condemned them to a 1-0 home defeat by mid-table Atletico Mineiro.
Otavinho grabbed the game's only goal as fifth-spotted Internacional triumphed 1-0 at Criciuma.
Goias were 2-1 winners at Corinthians. Alexandre Pato looked to have secured a point for the hosts when he notched in the 78th minute to cancel out Hugo's opener, but Amaral had the last word six minutes from time.
Sao Paulo moved out of the bottom four - at the expense of their opponents - by winning 2-0 at Vasco da Gama.
Rodrigo Caio opened the scoring just after the half-hour mark and Antonio Carlos made the points safe with a second goal 20 minutes from time.
Flamengo needed a late equaliser from Andre Santos to salvage a 1-1 draw at second-bottom Ponte Preta in a match which saw both sides reduced to 10 men.
It all seemed to be going wrong for the visitors midway through the second half when Samir was sent off and then Artur put the home team ahead three minutes later. But Santos scored in the 87th minute to ensure the spoils were shared, and then Ponte Preta defender Cesar saw red in stoppage time.
There was also late drama at Coritiba, where Alex's stoppage-time strike earned the hosts a 2-2 draw against Bahia.
The away team had led 2-0 through goals from Wallyson and William Barbio, but Titi's 65th-minute own goal made for a nervy finish and Alex's last-gasp intervention made them pay.
Finally, Dinei's double saw Vitoria edge Nautico 2-1 after the rock-bottom visitors had taken a 14th-minute lead through Hugo.