Sergio Almiron, who played on despite suffering an early knock, broke the deadlock just before half-time and the Elefanti held on to wrest seventh place back from Roma.
Bologna had won the reverse fixture 4-0 in September but failed to take their chances to widen a five-point gap above the relegation zone, with Alessandro Diamanti especially wasteful.
The visitors, who were second-best all afternoon, would do all their best work in the opening 30 minutes.
Diamanti tried to put the finishing touch on a fine move that had started in midfield but home goalkeeper Sergio Andujar raced back to parry the ball to safety.
The former West Ham striker then took aim from outside the box, with his poor shot always rising, after Alejandro Gomez had fluffed a decent opportunity at the other end.
Things might have been different for Catania had Almiron not opted to stay on the pitch after suffering a blow to his knee, but he gritted his teeth before testing Gianluca Curci with a dangerous header.
Archimede Morleo almost made the hosts' task easier by carelessly nodding the ball towards his own goal, narrowly missing the target, but Catania would take the lead of their own accord three minutes before the break.
An inch-perfect cross from Alejandro Gomez saw Gonzalo Bergessio's header deflected out for a corner, leaving Almiron to arrive at speed and head the ball past a stranded Curci.
The Argentinian nearly repeated the trick after the interval but this time Curci parried to allow Bologna some breathing space.
Indeed the visitors went close to equalising in th 52nd minute as Diamanti picked out Manolo Gabbiadini in the centre of the box, but the Italy Under-21 international shot wide on the turn.
Rene Khrin then looked for Alberto Gilardino on the edge of the area but the Sicilian defence closed ranks to keep him at bay.
Bologna were enjoying a second wind but Gilardino should have done better with a Gyorgy Garics cross as the game entered the final throes.
It would not be Bologna's day, though, and Mariano Izco missed one last chance to finish the visitors off just before referee Carmine Russo called time on proceedings.