bash, 78 bytes (usando una utilidad BSD) o 79 bytes (también no BSD)
Esto es un poco más largo que @DigitalTrauma y la agradable solución bash de 71 bytes de @ hvd, pero me gustó la idea de usar números en la base 60; Tengo curiosidad por saber si alguien puede jugar golf un poco más.
Con la utilidad jot estándar BSD:
jot '-wx=`dc<<<60do3^%d+n`;((`dc<<<$x++'$1'-n`))||tr \ :<<<${x:3}' 86400 0|sh
Con la utilidad seq más universalmente disponible:
seq '-fx=`dc<<<60do3^%.f+n`;((`dc<<<$x++'$1'-n`))||tr \ :<<<${x:3}' 0 86399|sh
La idea es generar los números del 0 al 83699 y usar dc para convertirlos en base 60. Los "dígitos" en la salida base-60 de dc son números de 2 dígitos del 00 al 59, con espacios que separan los "dígitos", por lo que esto enumera todos los tiempos deseados de 00 00 00 a 23 59 59 en casi el formato necesario.
Sin embargo, si literalmente lleva a cabo eso, los números por debajo de 60 ^ 2 no son números de 3 dígitos en la base 60, por lo que falta el 00 o 00 00 inicial. Por esa razón, en realidad estoy generando los números de 60 ^ 3 a 60 ^ 3 + 83699; esto asegura que todos los números generados tengan exactamente 4 dígitos de largo en la base 60. Esto está bien siempre y cuando eventualmente elimine el primer dígito adicional (01) que no es necesario.
Entonces, una vez que se generan los tiempos deseados, simplemente tomo cada cuádruple de 01 00 00 00 a 01 23 59 59, sumo los últimos tres números y resto el argumento $ 1. Si eso es 0, entonces tomo todo en el cuádruple desde el tercer personaje (tirando el "01"), uso tr para convertir espacios en dos puntos e imprimo el resultado.