Serie A Wrap: Di Natale sends Milan to defeat
The hosts had the better of the play at the Stadio Friuli and were rewarded as they secured a first win in a month and second against Milan since Clarence Seedorf took over at San Siro in January.
Milan striker Mario Balotelli made his return to the side, coming off the bench in the 63rd minute after missing the last two games with a shoulder injury.
But it was veteran forward Di Natale, who appears poised to conclude his playing career at the end of the campaign, that proved to be the difference-maker.
Di Natale found the net four minutes after Balotelli's introduction, finishing off a sweeping counter-attack involving Roberto Pereyra and Bruno Fernandes.
And from that point there was no way back for Seedorf's side as Milan slipped to a second successive Serie A loss.
Defeat leaves Milan mired in 11th position, six points adrift of city rivals Inter in fifth, but their troubles pale in comparison to that of Catania, who missed a chance to move out of the bottom three with a 1-1 draw at home to 10-man Cagliari.
Cagliari took the lead eight minutes into the second half when Uruguayan midfielder Matias Vecino found the net with a close-range finish.
However, the visitors' lead lasted less than 10 minutes, striker Gonzalo Bergessio heading home from Francesco Lodi's free-kick.
Catania's prospects of victory were boosted when they were handed a numerical advantage as Cagliari defender Danilo Avelar received a second yellow card for a foul on Sebastian Leto.
That dismissal prompted an onslaught from the hosts but the Sardinians held on to claim a point despite Cristiano Biraghi and Alexis Rolin hitting the woodwork for Catania.