The visitors soon had another good opportunity when Maximiliano Moralez curled a free kick just over the bar.
Atalanta continued to create the better of the chances and Denis fired wide from a tight angle after latching onto Franco Brienza's through-ball.
Moussa Kone was next to threaten for the visitors two minutes into the second half, but his header was beaten away by Frison.
The hosts had Frison to thank for keeping the scores level just past the hour mark, as he tipped Yohan Benalouane's powerful header over the bar.
The Rossazzurri made Atalanta pay for that missed chance as they took the lead in the 65th minute. Gonzalo Bergessio played the ball through to Francesco Lodi, who kept his composure to slide a low effort into the bottom corner.
Catania almost scored a second minutes later, but Francesco Fedato headed against the post from close range.
Their lead didn't last long, as Atalanta equalised in the 80th minute. Denis saw his strike tipped onto the bar by Frison and Kone reacted quickly to score from the rebound.
The game looked to be heading towards a draw until Catania were awarded a penalty in stoppage time for Benalouane's handball inside the box.
Bergessio stepped up to take the spot kick and made no mistake with a confident finish past Sportiello that earned his side a win in their final match of the season.