"What can you say about Tim Duncan that hasn't already been said," Spurs coach Gregg Popovich said. "He provides the leadership on this team. He is the center of the program."
The Rockets (5-4) scored their final points with 4:44 left on the clock. San Antonio scored the game's final 12 points, including a running hook shot by Duncan that gave the Spurs a 76-75 lead with 59 seconds left.
Rookie George Hill, playing in place of the injured Tony Parker at point guard, added 17 points to help San Antonio -- down 14 points with 7:37 to go -- improve to 3-5. San Antonio also is awaiting the return of Manu Ginobili from an ankle injury.
Houston's Ron Artest missed a 3-point try at the buzzer.
That was one of seven straight shots the Rockets missed to end the game. The Spurs closed out the game hitting four of six.
"This was a game we should have won," said Tracy McGrady said, who struggled through a 2-for-12 shooting night for seven points. "We had it in our pocket.
"We didn't play any defense."
Artest led Houston with 18 points. Brooks, playing at point guard in place of the suspended Rafer Alston, had 14.
The Rockets ended a five-game trip 2-3 and fell a half-game behind New Orleans in the Southwest Division.
Brooks could have won the game for Houston with what was looking to be an easy layup. He got the ball along the baseline and saw an open path to the basket. But Duncan quickly made up ground.
"I didn't think he was going to get there," Brooks said. "He made a great play. Blocked the shot. That was it."
Houston dominated the inside until that play. The Rockets outscored the Spurs 17-3 on second-chance points and scored eight more points in the paint than San Antonio.
But Duncan's block on Brooks made it a meaningless stat.
"I was just the last line of defense," Duncan said. "I mean there was kind of nothing else to do there. I see him break free and come out wide open. I'm the help-side defender and I got there just in time."
Houston led by 14 points when Brooks scored with 7:37 left in the game.
But the Spurs regained the lead with 59 seconds left on Duncan's layup over Yao Ming as the San Antonio offense cleared out the middle for Duncan to drive 1-on-1.
But after McGrady's miss, San Antonio failed to take advantage when Duncan missed a hook over Yao. Brooks then tried a baseline drive that Duncan blocked.
Brooks replaced Alston in the starting lineup. Alston sat out the first of his two-game suspension -- he'll also miss Saturday against New Orleans -- because he charged at the Suns' Matt Barnes during a fight Wednesday night in Phoenix.
McGrady was spared a suspension for his part -- he pushed Suns guard Steve Nash -- but he picked up a $25,000 fine.
Parker was on the Spurs' bench, limping, but not wearing the protective boot on his injured left ankle. ... Ime Udoka got his third consecutive start at small forward in place of Bowen, who ended a streak of 550 straight active-list starts last week. ... Duncan is averaging 19 shots a game, but he didn't get his first attempt off until 7:29 into the game when he made a near line-drive hook shot over Scola. ... Houston opened the game 0-for-6 and did not make a basket until 9:01 into the game on Brooks' drive. ... This was former Spurs' guard Brent Barry's first trip back to San Antonio since he signed a free-agent contract with the Rockets, but he did not play.