How to attach the Character to a moving base
I think this is what you are looking for : walk around and stick to animated objects.blend

Original Blender.Artists Thread link here

Video showing the following script in action here

THIS SCRIPT DOES NOT WORK WELL WITH CHARACTER PHYSICS!

USE DYNAMIC PHYSICS INSTEAD!

# Walk and stick on animated objects and planets v3
# by cotaks

# w,s,a,d and spacebar to move

# able to walk speheres and animated objects:
# like elevators/platforms/planets/beveled cubes/etc.
# when you jump off one of the objects, it will automatically turn +z axis back up

# it' a small script but very adjustable, i added more comments then script itself haha
# have fun with it.

from bge import logic

# from player origin to the floor
heigth_offset = 1.0 

# length of the raycast
# increase this to be able to jump higher before falling of an object 
# (also tweak jump force(brick) and (lower) gravity force)
ray_distance = 0.5 

# creates some player gravity, default 30. 
# (lower ables to jump off objects, higher means you can jump at all sides of the object)
# adjust the player jump force(brick), or adjust the gravity_force, i suggest keeping it 20+
#just experiment around with it till you are statisfied with the results
gravity_force = 30 

def cast_ray(own, vector):

    total_distance = ray_distance + heigth_offset
    return own.rayCast(vector, own, total_distance)


def stick_to_it(cont):

    own = cont.owner

    vector_z    = own.worldPosition - own.worldOrientation.col[2]
    ray_z       = cast_ray(own, vector_z) 

    if ray_z and ray_z[0] is not None:

    # this could be usefull if you use python for movement, stops the sliding
    # if you use this make sure you add a + to line 48 and 49 (so it becomes +=)
    #own.linearVelocity.x = 0
    #own.linearVelocity.y = 0

    # creates some player gravity
    vector = -own.worldOrientation.col[2] * gravity_force
    counter_gravity = own.applyForce(vector,False) 

    # match our speed with the ground speed (add a + before the = if you use the above code)
    own.linearVelocity.x = ray_z[0].linearVelocity.x
    own.linearVelocity.y = ray_z[0].linearVelocity.y

    # align to the floor
    own.alignAxisToVect(ray_z[2],2, 0.3) 

    # counters default gravity stops sliding down from the sides with player friction at 0
    # if you use player (material) friction (default 0.500) then you can remove this line
    own.applyForce((0,0,9.8*own.mass),False)

else:
    # put head (z axis) back up
    own.alignAxisToVect([0,0,2],2, 0.1) 


def update_physics(cont):
    # for the (animated) object(s), or any object that needs to update it
    # (if you want to walk on animated objects(with bones) they need this part)
    # always(true pulse)-python(module)-scriptname.update_physics
    # if you have multiple animated objects, your better of making using for loop here
    # if you use it remove the own.reinstancePhysicsMesh() and uncomment the for loop code
    # with the for loop the animated objects needs a property called: update_physics
    own = cont.owner
    own.reinstancePhysicsMesh()    

#    if not 'update_list' in own:         
#        own['update_list'] = [obj for obj in own.scene.objects if 'update_physics' in obj]
#    
#    for obj in own['update_list']:
#        obj.reinstancePhysicsMesh()  


Just add this script to your character like that :