index.php 에서 LFI 취약점이 발생해서 index.php의 코드를 가져와본다.

 

 

81~83번째 줄에서 LFI 취약점이 발생하고 .php가 붙어서 php 파일 말고는 실행할 수 없다.

위 코드가 index.php의 핵심이 되는 코드인데 debug_mode라는게 존재해서 이를 통해 변수들을 출력할 수 있다.

이외에도 주석으로 phpinfo.php라는 페이지가 있는데 phpinfo() 함수를 통해 웹서버의 서버 설정들을 보여준다.

설정중에 파일 업로드 기능이 활성화 되어있어 php 페이지로 파일을 던지면 http 통신이 끊어지기 전까지

/tmp 디렉토리에 php[A-Za-z0-9]{6}의 형식으로 난수파일명으로 변환되어 일시적으로 파일이 저장된다.

(실제로 테스트 해본결과 http 통신이 끊어져도 바로 삭제되지는 않는다.)

아무튼 좋다. 일단 서버에 파일업로드를 하는것 까지는 했는데 문제는 서버에 올라간 코드를 어떻게 실행할것이냐?

문제는 파일명이 난수화 되어 업로드 되서 확장자가 날라간다는 점이다.

이를 해결할 수 있는 방법은 zip wrapper를 통해 압축 파일을 서버에 올려 실행하는 방법이다.

zip wrapper는 압축파일 속에 있는 파일을 띄워주는 역할을 하는데

LFI 취약점이 존재하므로 zip안에 php 코드가 있다면 LFI 취약점을 통해 내가 올린 파일을 실행할 수 있다.

 

 

위 코드를 압축해서 zip 파일로 만든다.

 

 

이렇게 만든 파일을 index.php?page=index&debug_mode=31337로 던지면 debug_mode 덕분에

내가 던진 파일이 /tmp 디렉토리에 어떠한 난수값으로 업로드 되었는지 알 수 있고 include 하는 페이지가

index.php이기 때문에 무한루프에 빠져 http 통신이 안끊어지도록 하여 레이스컨디션 공격이 가능하다.

 

 

이러한 방식으로 무한루프에 빠져 변수정보가 계속 출력이 되고 여기서 /tmp/php5HKDtk라는 파일명을 뽑을수있다.

 

index.php?page=zip:///tmp/php5HKDtk%23a 로 접속을 시도하면 실질적으로

index.php?page=zip:///tmp/php5HKDtk#a.php 로 접속하는 꼴이 되어 /tmp/php5HKDtk 파일의 압축을 해제하여

그 안에 있는 a.php를 include 한다 라는 뜻이 된다.

이러한 방식으로 remote code execution을 성공했고 마찬가지 방식으로 flag를 출력할 수 있다.

 

'문제 > CTF' 카테고리의 다른 글

CODEGATE 2017 Prequals RamG-thunder  (0) 2017.02.15

pe 파일을 받았다. 실행시켜보니 암호화 문제같았다.


암호화 알고리즘을 분석해 복호화 알고리즘을 구현하는 문제같아서 IDA를 통해 분석해보았다.



string 검색을 통해보니 hidden menu라는 문자열이 보인다.



입력 받는 부분에서 4를 입력하면 hidden menu가 나온다. 암호화 알고리즘은 fake인가보다.



hidden menu를 보니 숨겨진 flag를 찾는 게임이라고 하고 각 단계별로 stage5까지 있다.



먼저 입력을 받으면 바이트 단위로 XOR연산을 하는데 


input값과 메모리의 값을 xor해서 특정 값(v40)과 비교를 한다. 




v50="MVYLXYUARJ" 이므로 v50과 메모리의값을 XOR연산하면 stage1의 input값이 나온다.


후에 안티디버깅을 해주는데 레지스터값 수정을통해 우회한다.



stage2는 특정 구조체에 있는 값을 비교해주는데 디버깅을 통해 메모리 값을 변조하여 우회하였다.



stage3는 레지스트리값을 검증하는데 HKEY_CURRENT_USER -> Hellow -> hellow_FishWorld 라는 레지스트리가 있기만 하면 통과된다.



regedit을 통해 레지스트리를 생성해주었다.



stage4는 stage2와 마찬가지로 특정 구조체의 값을 디버깅을 통해 변조하고 


간단한 안티디버깅을 하는데 마찬가지로 레지스터값을 변조해 우회하면 된다.



stage5는 stage1과 마찬가지로 input값을 특정값과 XOR연산해서 비교한다.



이번에는 v36과 비교를 하는데 간단한 코딩을 통해 stage5의 input값을 알아내었다.



최종적으로 v42에 위에서 단계별로 통과하며 얻은 값을 붙여주는데 v42를 통해 연산을 해서 c라는 파일을 생성한다.



파일 시그니쳐를 보니 png파일이다.




확장자를 붙여주니 올바르게 이미지가 보이고 클리어


'문제 > CTF' 카테고리의 다른 글

2016 WhiteHat Contest JB  (0) 2018.04.09

+ Recent posts