Frank Castle (Ray Stevenson), who by now has been the Punisher for five years, assaults a party for mob boss Gaitano Cesare. Billy Russoti (Dominic West) escapes to his recycling plant hideout, and Detectives Martin Soap (Dash Mihok) and Saffiotti (Tony Calabretta), who were staking out the party, inform Castle. Castle infiltrates Russoti's hideout, and a brief firefight, Russoti is thrown into a glass-crushing machine that leaves him hideously disfigured. Russoti later refers to himself as "Jigsaw" because the stitches in his face resemble puzzle pieces. Castle, who has taken cover behind the body of Nicky Donatelli (Romano Orzari), discovers that a presumed thug he had killed in the hideout was an undercover FBI agent.
Agent Paul Budiansky (Colin Salmon), the deceased agent's partner, joins the NYPD's "Punisher Task Force", partnering with Soap to help bring Castle to justice; unknown to him, the task force was created to inadvertently help support Castle's cause. Meanwhile, Jigsaw frees his deranged brother, "Loony Bin Jim" (Doug Hutchison).
Distraught over killing the agent, Castle attempts to make reparations to Donatelli's wife, Angela (Julie Benz), and daughter, Grace (Stephanie Janusauskas), to no avail. Castle threatens to retire from the vigilante business, but his armorer, Microchip (Wayne Knight), forces him to reconsider, telling him Jigsaw will go after Donatelli's family for revenge.
Jigsaw, Loony Bin Jim, and two goons, Ink and Pittsy, break into Donatelli's house and hold the family hostage. The Punisher tracks down Maginty (T. J. Storm) a known associate of Jigsaw, executing Maginty after he has told what he knows. Budiansky and Soap attempt to arrest the Punisher, who disarms them, but Budiansky handcuffs himself to the Punisher. The Punisher tells him Jigsaw went after Donatelli's family, and Budiansky sends a police car to check on the Donatelli house, intending to turn the Punisher inn. When the patrol car fails to respond, Budiansky checks on the house, where he is caught by Ink and Pittsy. Soap frees the Punisher, who kills Ink and Pittsy before leading Donatellis wife and daughter away. Budiansky then arrests Jigsaw and Loony Bin Jim after a short gun fight.
Jigsaw and his brother bargain with the FBI for their release by giving up Cristu Bulat (David Vadim), who was smuggling in a biological weapon destined for Arab terrorists in Queens, New York. The brothers are granted immunity, plus the US$12 million Bulat was paying to use Jigsaw's port, and a file on Micro. They take Micro hostage, killing his mother in the process. They once again take the Donatellis hostage, after critically injuring Carlos, whom Castle had left to protect them. Castle later arrives at the hideout to find evidence of their break-in and sees a badly wounded Carlos. He informs Castle of what happened and is then mercy killed in consent, by a sorrowful Castle. Jigsaw sets himself up in the Bradstreet Hotel, hiring a small private army of criminals. Castle enlists the help of Budiansky, who informs Cristu's father, Tiberiu Bulat (Aubert Pallascio), where Jigsaw is located. Tiberiu's goons start a shootout in the hotel lobby, affording Castle a distraction.
Castle enters through a second-floor window, leading to a firefight with Jigsaw's hired guns. Afterward, Loony Bin Jim engages Castle in hand-to-hand combat; realizing he will probably not survive the brawl, Jim runs away. Castle chases him and confronts both him and Jigsaw, who are holding Micro and Grace Donatelli at gunpoint. Jigsaw gives Castle a choice: If Frank shoots Micro, Jigsaw will let the others go free. Micro bravely offers his life to save the girl, but Castle chooses to shoot Loony Bin Jim instead. As a result, Jigsaw kills Micro. Enraged by the loss of his partner, Castle attacks Jigsaw, eventually impaling him with a metal rod and throwing him onto a fire. As Jigsaw burns to death, Castle calmly tells him, "This is just the beginning." Outside, Angela forgives Castle, who bids farewell to Budiansky and the Donatelli family.
As Castle and Soap leave together, Soap tries to convince Castle to give up his vigilante status after having "killed every criminal in town." Soap however changes his mind when he is attacked by a murderous mugger who quickly becomes another victim of the Punisher.