천천히 다시 시작해보자. Just2020. 10. 1. 16:41
어떻게 시작한담..!?
※ LEVEL 16
Q. There is a perl script running on port 1616.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #!/usr/bin/env perl use CGI qw{param}; print "Content-type: text/html\n\n"; sub login { $username = $_[0]; $password = $_[1]; $username =~ tr/a-z/A-Z/; # conver to uppercase $username =~ s/\s.*//; # strip everything after a space @output = `egrep "^$username" /home/flag16/userdb.txt 2>&1`; foreach $line (@output) { ($usr, $pw) = split(/:/, $line); if($pw =~ $password) { return 1; } } return 0; } sub htmlz { print("<html><head><title>Login resuls</title></head><body>"); if($_[0] == 1) { print("Your login was accepted<br/>"); } else { print("Your login failed<br/>"); } print("Would you like a cookie?<br/><br/></body></html>\n"); } htmlz(login(param("username"), param("password"))); | cs |
A. 이번 문제는 명령어 인젝션 문제이다.
이전에도 구동중인 서비스에 명령어 인젝션하는 문제가 있었는지는 가물가물하지만, 인젝션 문제는 자주 나왔던거 같다. 가벼운 트릭 하나만 쓰면 쉽게 풀리는 문제니까 바로 문제풀이 들어가도록 하겠다.
[그림 1] 실행 파일 작성
flag16 계정이 접근할 수 있는 위치에 파일을 생성한 뒤 other 권한에 실행 권한을 부여한다. 우리는 명령어 인젝션을 할 것이니까~~!
[그림 2] 명령어 인젝션
명령어를 실행시키기 위해 ` 문자로 감싸고 경로에 별표를 삽입하여 모든 경로를 탐색할 수 있게 한다.
요것이 바로 트릭이라면 트릭~ 사전에 이 문자의 기능을 알고 있었다면 쉽게 풀었을 것이다 :)
[그림 3] 플래그 획득
플래그 획득~
[문제풀이] Nebula, Level15 (0) | 2017.07.25 |
---|---|
[문제풀이] Nebula, Level13, Level14 (0) | 2017.07.23 |
[문제풀이] Nebula, Level11, Level12 (0) | 2017.07.21 |
[문제풀이] Nebula, Level09, Level10 (0) | 2017.07.19 |
[문제풀이] Nebula, Level05, Level06, Level07, Level08 (0) | 2017.07.16 |
※ LEVEL 15
Q.
strace the binary at /home/flag15/flag15 and see if you spot anything out of the ordinary.
You may wish to review how to “compile a shared library in linux” and how the libraries are loaded and processed by reviewing the dlopen manpage in depth.
Clean up after yourself :)
A. 이 문제는 라이브러리를 로드하는 순서의 우선 순위를 이용하는 문제이다.
이번 문제는 차근차근 확인해보도록 하겠다.
[그림 1] 문제 실행 화면
문제에서 주문한 바와 같이 strace 명령어를 이용하여 프로그램의 상태를 확인해보았다. 참고로 strace 명령어는 간단히 말하자면 시스템 함수 호출과 시그널을 추적하는 툴이다.
[그림 1]에서 보는 바와 같이 "libc.so.6"을 open 함수의 인자 값으로 설정하여 호출하지만 계속 실패하게 된다.
[그림 2] objdump 명령어로 섹션 확인
objdump 명령어를 통해 문제를 확인해보면 RPATH 가 설정되어 있는 것을 알 수 있다. 이 RPATH는 실행 파일이나 라이브러리에 런타임 시 필요한 라이브러리를 찾기 위해 설정해 놓는다(필수 설정 값은 아님).
단, 해당 설정을 해놓으면 /lib, /usr/lib 과 같은 표준 라이브러리 경로를 검색하기에 앞서 RPATH로 설정한 경로를 검색한다. 그럼 이제 우리는 동일한 라이브러리 이름을 갖는 라이브러리를 만들어 해당 문제에서 사용하는 함수의 이름을 사용하여 함수를 만들 것이다.
[그림 3] 라이브러리 코드
[그림 3]을 컴파일하여 라이브러리로 만들 것이다. 간단히 소스코드 내용을 말하자면 생성자를 활용하여 메인 함수보다 먼저 실행하도록 하였고 이는 system 함수를 호출한다. 물론 문제에서 동작하는 다른 함수를 대체해도 문제가 될 것은 없으나 좀 더 번잡스러워진다. 그 이유는 선택한 함수가 실행되기 전까지의 모든 함수를 라이브러리에 만들어줘야 하기 때문이다. 같은 이유로 __cxa_finalize 함수가 선언되었다.
아래의 [그림 4]는 __cxa_finalized 함수가 선언되기 전에 발생한 에러 메시지이다. 단순 참고용 !
[그림 4] 에러 구문
[그림 5] 컴파일 후 문제 실행
마지막으로 해당 위치에 libc.so.6 이름의 라이브러리 파일을 생성한 뒤 문제를 실행하면 쉘을 획득할 수 있다.
[문제풀이] Nebula, Level16 (0) | 2017.08.07 |
---|---|
[문제풀이] Nebula, Level13, Level14 (0) | 2017.07.23 |
[문제풀이] Nebula, Level11, Level12 (0) | 2017.07.21 |
[문제풀이] Nebula, Level09, Level10 (0) | 2017.07.19 |
[문제풀이] Nebula, Level05, Level06, Level07, Level08 (0) | 2017.07.16 |