본문 바로가기

Computer Security/CTF

[Secuinside 2013] givemeshell, write up

파일디스크립터 문제이다.


쉘에서,


$ ls > file


으로 할때, file에 명령어의 결과가 저장된다는것은 다들 알것이다. 사실 이건


$ ls 1>file


을 생략한 버전이다.


1번은 stdout을 의미한다. (쉘 화면에 출력되는것)

그외에 0번은 stdin이고, 2번은 stderr 이다.


문제를 보면, 5글자까지 system으로 실행을 시켜준다.

하지만, fork로 되어있기때문에, 출력 결과값이 우리에게 돌아오지는 않는다.

우리의 소켓번호는 4번으로 일정하다. (fork이기 때문에)


그렇다면,


ls>&4


를 치게되면, 그 결과값을 4번 디스크립터인, 연결되어있는 소켓에 쏴준다.

그러면 그 결과가 클라이언트에게 날아가게 된다.


대충 느낌이 왔으니, 이제 쉘을 실행한다. 쉘은 원래 0번 디스크립트인 stdin을 이용해서 입력을 하지만, 여기서는 소켓으로 입력을 하고 싶은 상황이다.

그렇다면,


sh<&4


를 치게되면, 쉘을 실행하고, 그 입력값은 소켓을 통해 전달한다는 의미이다.

하지만, 끝이 아니다. 그 결과값은 아직도 stdin으로 출력이 되는 상황이기때문에, 명령어를 실행할때 뒤에 >&4 를 붙여줘야한다.

결국 공격방법은


sh<&4

ls>&4

cat key>&4