'becomes' script (was Re: last call ... newgrp...)
Will Partain <[email protected]> Mon, 10 Jun 2002 16:54:27 +0100
| Newsgroups | gmane.comp.sysutils.ark.devel |
|---|---|
| Message-ID | <[email protected]> |
Just for sport, decided to sketch a 'becomes --user=... --group=...'
script, to see what horrors unfold.
I decided it's no security risk at all, because you've got
to be root already before it does anything interesting :-)
Is this line worth pursuing? (run 'ssh remote becomes
--user=... --group=...' and blast the desired script at it?)
Will
==== becomes script =====
#!/usr/bin/env python
import grp,os,pwd,string,sys
intended_user = None
intended_grp = None
for arg in sys.argv[1:]:
if arg[0:7] == '--user=':
intended_user = arg[7:]
elif arg[0:8] == '--group=':
intended_grp = arg[8:]
else:
sys.stderr.write('duff arg:%s\n'%arg)
sys.exit(1)
if intended_user == None:
sys.stderr.write('--user=... not set\n')
sys.exit(1)
if intended_grp == None:
sys.stderr.write('--group=... not set\n')
sys.exit(1)
if len(intended_user) <= 0:
sys.stderr.write('--user=%s is duff\n'%intended_user)
sys.exit(1)
if len(intended_grp) <= 0:
sys.stderr.write('--group=%s is duff\n'%intended_group)
sys.exit(1)
try:
intended_uid = pwd.getpwnam(intended_user)[2]
except KeyError:
sys.stderr.write('--user=%s is duff\n'%intended_user)
sys.exit(1)
try:
intended_gid = grp.getgrnam(intended_grp)[2]
except KeyError:
sys.stderr.write('--group=%s is duff\n'%intended_grp)
sys.exit(1)
# Is this user in that group? (chk both pwd and grp dbs)
# root is excluded from this test
grp1_gid = pwd.getpwnam(intended_user)[3] # primary grp, from pwd
grpN_mems = grp.getgrnam(intended_grp)[3] # other grps, by name
if intended_uid == 0 or intended_gid == grp1_gid or intended_user in grpN_mems:
pass
else:
sys.stderr.write('--=%s is not in --group=%s\n'%(intended_user,intended_grp))
sys.exit(1)
curr_euid = os.geteuid()
curr_egid = os.getegid()
if intended_gid != curr_egid:
# 2.2 -> os.setgroups to the user's legit list;
# otherwise, we are probably operating with root's
os.setgid(intended_gid)
if intended_uid != curr_euid:
os.setuid(intended_uid)
sh = os.popen('/bin/sh','w',0) # 0 -> unbuffered
#sh.write('/usr/bin/id\n')
while 1:
l = sys.stdin.readline()
if not l: break
sh.write(l)
status = sh.close()
if status != None:
sys.stderr.write('/bin/pipe close failed!\n')
sys.exit(1)
_______________________________________________________________
Don't miss the 2002 Sprint PCS Application Developer's Conference
August 25-28 in Las Vegas - http://devcon.sprintpcs.com/adp/index.cfm?source=osdntextlink