H1-4420: From Quiz to Admin – Chaining Two 0-Days to Compromise An Uber WordPress

링크:

https://www.rcesecurity.com/2019/09/H1-4420-From-Quiz-to-Admin-Chaining-Two-0-Days-to-Compromise-an-Uber-Wordpress/

요약:

  1. 해당 취약점은 두 가지 취약점은 연계하여 admin credential을 takerover함 (Unauthenticated Stored XSS, Authenticated SQL Injection)
  2. 첫 번째 취약점은 php/slickquiz-scores.php의 generate_score_row에서 유저의 인풋을 통해 admin이 admin 페이지에 접속하여 정보를 조회할때 XSS가 가능한 취약점.
  3. 두 번째는 admin으로 로그인 했을때 wp-admin의 slickquize-scoreds 페이지의 id 인자에서 SQL Injection이 존재
  4. SQL Injection이 담긴 페이지를 요청하는 javascript를 로드하도록 XSS의 src를 해커의 페이지로 변경하여 강제로 실행하도록 함. 인젝션을 통해 user_pass가 출력됨

Pwn Them All #BugBounty

링크:

요약:

  1. 패스워드 리셋 기능을 보낼때 X-Forwarded-Host를 악성 도메인으로 변조하여 요청
  2. 희생자에게 메일 도착
  3. 메일이 도착했을때 패스워드 리셋링크가 X-Forwarded-Host의 링크로 변조되어 클릭시 패스워드 리셋 토큰이 공격자에게 보이게됨

Exploiting File Uploads Pt. 2 – A Tale of a $3k worth RCE.

링크:

https://anotherhackerblog.com/exploiting-file-uploads-pt-2/

요약:

  1. 신분 검사를 위해 사진을 업로드하는 페이지가 존재하는데 파일 확장자를 클라이언트 측에서 검사를 하여 burp suite로 우회가능
  2. 무슨 파일을 올릴지 고민하다가 XSS hunter라는 툴을 통해 직원이 파일 실행하는 것을 확인

파일 업로드를 했는데 직원이 실행하여 RCE 라고 올렸는데,, 흠,, 애매한 취약점이었던 듯 하다. 이 취약점이 3k나 받았다는 것도 놀라울 따름..

How two dead accounts allowed REMOTE CRASH of any Instagram android user

링크: https://www.valbrux.it/blog/2019/09/13/how-two-dead-users-allowed-remote-crash-of-any-instagram-android-user/

요약:

  1. 인스타그램은 PKID라는 아이디 번호가 있는데, 가장 초기에 만들어진 1, 2가 아이디 이름이 공백으로 되어 있음. 공백으로 되어있을 시 예외를 제대로 처리하지 않았을 가능성이 농후함.
  2. 다른 사람을 그룹에 초대한 후 아이디 1,2를 초대하도록 서버에 요청을 보내면 초대된 사람 측에서 어플이 Denial of Service

Race Condition that could Result to RCE - (A story with an App that temporary stored an uploaded file within 2 seconds before moving it to Amazon S3)

링크:

요약:

  1. sql injection으로 내부 dashboard의 admin 권한을 얻음
  2. upload.php라는 기능에서 php 확장자를 필터링하지만 modify.php라는 이전에 올린 파일을 수정하는 기능에서는 php 필터링을 확장하지 않아서 쉽게 php 파일을 업로드하는 것이 가능했다. (웹쉘 업로드)
  3. 문제는 이 웹쉘 업로드한 것을 S3로 옮길 뿐더러 경로를 알 수 없다는 것. 이것을 우회하기 위해 modify.php에 여러번 리퀘스트 패킷을 발생시키니 레이스 컨디션이 발생하여 에러와 함께 파일의 풀경로가 출력됨
  4. 위의 얻은 경로를 계속 요청하며 파일을 업로드하면 S3로 옮기기 전에 파일이 남아있을 때 운좋게 접속하면 쉘 획득

Exploiting JSONP and Bypassing Referer Check

https://medium.com/bugbountywriteup/exploiting-jsonp-and-bypassing-referer-check-2d6e40dfa24

JSONP가 뭔가 해서 인터넷을 찾아봤는데 다음 링크가 가장 잘 나와있는 듯하다.

http://dev.epiloum.net/1311

SOP를 우회하기 위해 JSONP라는 기법을 이용하게 되는데, 문제는 이를 사용하는 서버에서 데이터를 유출할 수 있다는 점이다. 하지만 해당 서버에서 Referer header를 체크하는 보안 검증 기법이 있었고 단순하게 해당 속성을 no-referrer 로 주어서 해결하였다.

도커(Docker) APM 환경 구축

안녕하세요.
백수 pesante 입니다.

최근 웹해킹을 공부하면서 APM을 구축해야 할 상황이 생겼는데 도커를 이용하면 굉장히 편리하게 구축할 수 있어서 그에 대한 포스팅을 하려 합니다. 도커에서는 어플리케이션 및 웹서버만 실행하고, 컨테이너 내부의 디렉토리와 외부 OS(Host OS)의 디렉토리를 연동합니다.

이렇게 설정하는 이유는 실질적인 웹 코딩을 외부 OS에서 진행할 수 있기 때문입니다. 즉, 코드를 변경하기 위해 도커에 접속할 필요가 없죠. 환경세팅 및 실행은 도커에 밀어넣고 웹 코딩은 host os에서 하는 겁니다. 그 순서는 다음과 같습니다.

  1. 도커 이미지 다운로드
  2. 도커 컨테이너 실행 with 몇 가지 옵션

APM이 설치된 도커 이미지는 사실 많습니다. 그러나 저는 웹해킹을 위한 최소한의 환경만 구축하길 원했고 그 결과 고른 이미지는 다음과 같습니다.

https://hub.docker.com/r/mattrayner/lamp/#introduction

lamp 이미지가 지원하는 php 및 우분투 정보는 다음과 같습니다.

스크린샷 2019-01-13 오후 2.58.46

우선 도커 이미지를 다운로드 합니다. 원하는 php 및 우분투 버전에 따라 다르게 pull 하시면 됩니다.

# Launch a 16.04 (php5) based image
docker pull mattrayner/lamp:latest-1604

# Launch a 14.04 (php5) based image
docker pull mattrayner/lamp:latest-1404

# Launch a 16.04 (php7) based image
docker pull mattrayner/lamp:latest-1604-php7

# Launch a 14.04 (php7) based image
docker pull mattrayner/lamp:latest-1404-php7

그 다음 다운로드 받은 이미지를 컨테이너로 만들어 실행하면 됩니다. 그런데 이때 옵션을 주게 됩니다.

  1. -p “80:80” : 컨테이너의 80포트와 외부 OS의 80포트를 매치시킵니다.
  2. -v ${PWD}/app:/app : 외부 os의 “실행시점의 폴더”/app 디렉토리를 컨테이너 내부의 /app와 동기화 합니다. /app은 lamp 이미지에서 설정된 웹서버의 루트 디렉토리입니다.

실행하기에 앞서 편한 곳에다가 app 디렉토리를 만들어줍니다. 저는 /root/docker-apm/app에 만들었습니다. 그리고 app 디렉토리 내부에 index.php를 만들어 줍니다.

root@ubuntu:~/docker-apm# mkdir app
root@ubuntu:~/docker-apm# ls
app 
root@ubuntu:~/docker-apm# echo "test" >> ./app/index.php
root@ubuntu:~/docker-apm# ls -l ./app/
total 4
-rw-r--r-- 1 pesante staff 10 Jan 13 15:23 index.php

후에 app가 존재하는 디렉토리(저는 /root/docker-apm)에서 컨테이너를 실행합니다. 다운로드 받은 이미지 버전에 맞게 다음 중에서 하나를 골라 실행해주시면 됩니다.

# Launch a 16.04 (php5) based image
docker run -p "80:80" -v ${PWD}/app:/app mattrayner/lamp:latest-1604

# Launch a 14.04 (php5) based image
docker run -p "80:80" -v ${PWD}/app:/app mattrayner/lamp:latest-1404

# Launch a 16.04 (php7) based image
docker run -p "80:80" -v ${PWD}/app:/app mattrayner/lamp:latest-1604-php7

# Launch a 14.04 (php7) based image
docker run -p "80:80" -v ${PWD}/app:/app mattrayner/lamp:latest-1404-php7

위의 명령어를 실행하면 컨테이너 안에 필요한 패키지들을 설치하고 자동으로 설정을 진행합니다. 이 때 작업이 완료되어도 실행종료가 되지 않으므로 마지막 줄의 “INFO success: apache2 entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)” 가 실행되었다면 브라우저를 통해 접속해보도록 합니다

rm: cannot remove '/var/run/mysqld/mysqld.sock': No such file or directory
=> An empty or uninitialized MySQL volume is detected in /var/lib/mysql
=> Installing MySQL ...
=> Done!
=> Waiting for confirmation of MySQL service startup
=> Creating MySQL admin user with random password
ERROR 1133 (42000) at line 1: Can't find any matching row in the user table
=> Done!
========================================================================
You can now connect to this MySQL Server with 임시비밀번호

    mysql -uadmin -p임시비밀번호 -h<host> -P<port>

Please remember to change the above password as soon as possible!
MySQL user 'root' has no password but only allows local connections

enjoy!
========================================================================
/usr/lib/python2.7/dist-packages/supervisor/options.py:297: UserWarning: Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); you probably want to specify a "-c" argument specifying an absolute path to a configuration file for improved security.
  'Supervisord is running as root and it is searching '
2019-01-13 06:11:00,295 CRIT Supervisor running as root (no user in config file)
2019-01-13 06:11:00,295 WARN Included extra file "/etc/supervisor/conf.d/supervisord-apache2.conf" during parsing
2019-01-13 06:11:00,295 WARN Included extra file "/etc/supervisor/conf.d/supervisord-mysqld.conf" during parsing
2019-01-13 06:11:00,306 INFO RPC interface 'supervisor' initialized
2019-01-13 06:11:00,306 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2019-01-13 06:11:00,307 INFO supervisord started with pid 1
2019-01-13 06:11:01,311 INFO spawned: 'mysqld' with pid 490
2019-01-13 06:11:01,313 INFO spawned: 'apache2' with pid 491
2019-01-13 06:11:02,542 INFO success: mysqld entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2019-01-13 06:11:02,542 INFO success: apache2 entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

브라우저로 접속해서 (http://VMip주소) 다음과 같은 화면이 뜨면 성공한 것입니다.

스크린샷 2019-01-13 오후 3.25.55

http://VMip주소/phpmyadmin로 접속하면 phpmyadmin도 사용가능합니다. 이때 비밀번호는 위에 컨테이너를 run 했을 때 나오는 로그에서 볼 수 있습니다.

You can now connect to this MySQL Server with 임시비밀번호

    mysql -uadmin -p임시비밀번호 -h<host> -P<port>

Please remember to change the above password as soon as possible!
MySQL user 'root' has no password but only allows local connections
스크린샷 2019-01-13 오후 3.27.59

그럼 이제 도커에 접속하지 않고 외부의 /docker-apm/app에서 웹 코드를 수정하는 것만으로 개발 및 테스팅이 가능합니다.