[Root Me] Python - input() - 포너블
파이썬과 관련된 포너블 문제
파이썬 스크립트의 취약점을 이용해
.passwd 파일의 내용을 읽어 비밀번호를 획득하면 된다.
문제에서는 파이썬 소스코드와
원격 접속할 수 있는 WebSSH 링크가 제공된다.
WebSSH 를 이용하면 이렇게 원격에서 웹으로 작업할 수 있다.
ls -al 을 해보니
.passwd 와 ch6.py, setuid-wrapper 파일이 보인다.
ch6.py 외에는 모두 app-script-ch6-cracked 소유의 파일이다.
당연하게도 .passwd 파일은 권한이 없어 읽을 수 없다.
setuid-wrapper.c 파일을 보면
setreuid 를 사용해서 ch6.py 파일을 실행시킨다.
위에서 setuid-wrapper 파일을 봐도 권한에 s 가 들어가 있는게 보인다.
setuid-wrapper 파일을 이용해 ch6.py 파일을 실행시켜야 한다.
#!/usr/bin/python2
import sys
def youLose():
print "Try again ;-)"
sys.exit(1)
try:
p = input("Please enter password : ")
except:
youLose()
with open(".passwd") as f:
passwd = f.readline().strip()
try:
if (p == int(passwd)):
print "Well done ! You can validate with this password !"
except:
youLose()
이게 ch6.py 의 내용이다.
사용자의 입력값을 받아 p 라는 변수에 저장,
.passwd 파일의 내용을 passwd 변수에 저장하고
p == int(passwd) 인지 확인한다.
하지만 p 에 들어가는 값에 대해 제약이 없기 때문에
장난을 칠 수 있다.
./setuid-wrapper 를 실행시킨 후
Please enter password : 라고 나오면
__import__('os').system('cat .passwd') 라고 입력하면 된다.
__import__('os').system('cat .passwd') == int(passwd) 가 되어
참이 되기 때문에 비밀번호를 확인할 수 있다.