Overnight leader Nicolas Roche was fourth, eight seconds back, enabling Moreno to take over the race lead by one second from the Irishman.
Italian race favourite Vincenzo Nibali is third, 19 seconds further behind. Moreno, winner of the Fleche Wallone Classic this year, said he had attacked at the same point as Rodriguez had when winning the same stage two years ago.
"Those last 100 metres were interminable, but if there was one day of the Vuelta I could be leader, it was today," Moreno told reporters.
"Nicolas only had a small advantage, so I was determined to try and snatch the lead if I could. I've never led a Grand Tour before, so this was a very special moment for me."
Moreno said there had been no change in the hierachy of the Katusha squad, with Rodriguez, third in last year's race and third in the Tour in July, remaining the team's overall leader.
"I'm the theoretical leader, he's the real one," Moreno said. "There's no jealousy between us. He's going to have his chance later in the race."
Roche was relaxed about losing the race lead that he had managed to defend for just one day.
"I'm one second behind, so it's not that bad, there's time to get it back. Finishing fourth on a climb like that is a sign my legs are in good shape," the Saxo-Tinkoff rider said.
"Yesterday when I took the lead was such a great day that I won't forget, and I hope on tomorrow's climb I'll be able to get that second back on Moreno."
Monday's stage is the last and most difficult of three straight mountain stages, with a summit finish on the 15.8 kms Hazallanas climb in southern Andalusia.
1. Daniel Moreno (Spain / Katusha) 4:18:57"
2. Alejandro Valverde (Spain / Movistar) +4"
3. Joaquim Rodriguez (Spain / Katusha)
4. Nicolas Roche (Ireland / Saxo - Tinkoff) +8"
5. Samuel Sanchez (Spain / Euskaltel) +9"
6. Rinaldo Nocentini (Italy / AG2R)
7. Vincenzo Nibali (Italy / Astana)
8. Philippe Gilbert (Belgium / BMC Racing) +13"
9. Warren Barguil (France / Argos)
10. Igor Anton (Spain / Euskaltel) +15"
1. Daniel Moreno (Spain / Katusha) 35:58:34"
2. Nicolas Roche (Ireland / Saxo - Tinkoff) +1"
3. Vincenzo Nibali (Italy / Astana) +20"
4. Alejandro Valverde (Spain / Movistar) +22"
5. Chris Horner (U.S. / RadioShack) +28"
6. Joaquim Rodriguez (Spain / Katusha) +56"
7. Leopold Koenig (Czech Republic / NetApp) +1:09"
8. Haimar Zubeldia (Spain / RadioShack) +1:10"
9. Rigoberto Uran (Colombia / Team Sky) +1:24"
10. Ivan Santaromita (Italy / BMC Racing) +1:26"