문제 분석
def key_required(view):
@wraps(view)
def wrapped_view(**kwargs):
apikey = request.args.get('API_KEY', None)
if API_KEY and apikey:
if apikey == API_KEY:
return view(**kwargs)
return 'Access Denined !'
return wrapped_view
@app.route('/admin', methods=['GET'])
@key_required
def admin():
cmd = request.args.get('cmd', None)
if cmd:
result = subprocess.getoutput(cmd)
return result
else:
return 'Error !'
- /admin 페이지에 접속하려면 올바른 API_KEY를 입력해야 함
- argument로 건네준 cmd 명령어를 실행 가능
@app.route('/file', methods=['GET'])
def file():
path = request.args.get('path', None)
if path:
data = open('./files/' + path).read()
return data
return 'Error !'
- 여기서 서버의 파일들 읽어올 수 있다
user nginx;
worker_processes 1;
error_log /var/log/nginx/nginx_error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/nginx_access.log main;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
}
daemon off;
- nginx.conf 파일을 봤는데 저 접속기록(access_log)에 뭔가 데이터가 남아있지 않을
- /var/log/nginx/nginx_accesss.log 를 살펴보면 되겠다
문제 풀이
file?path=../../../../../var/log/nginx/nginx_access.log 에 접속했더니 API_KEY 제대로 얻을 수 있었음
관리자가 보낸 GET요청이 남아있었다
file?path=../../../root/.bash_history 혹은 file?path=../../home/user/.bash_history 에 접속했더니
관리자가 사용했던 명령어들 확인 가능했다
file?path=../../../../../proc/self/environ 으로 환경변수를 전부 확인해도 되겠다
API_KEY를 획득한 후 /admin 페이지에 접속해서 적당히 서버의 플래그를 빼내면 되겠다
(file /flag 해서 플래그 바이너리의 형식을 파악하고 leak 해보자~)
'security > 웹해킹' 카테고리의 다른 글
php output buffering (0) | 2023.09.05 |
---|---|
[Dreamhack CTF Season 4 Round #3] KeyCat (0) | 2023.08.06 |
[Dreamhack Wargame] Apache htaccess (0) | 2023.07.17 |
[Dreamhack Wargame] Command Injection Advanced (0) | 2023.07.15 |
Linux Command Injection Technique 정리 (0) | 2023.07.15 |