https://dreamhack.io/wargame/challenges/418/
Apache htaccess
Description 파일 업로드 기능을 악용하여 서버의 권한을 획득하세요 !
dreamhack.io
처음 웹 페이지에 접속한 화면이다.
파일 업로드 하는 페이지인 듯 하다. 대충 웹셸 업로드해서 웹 셸로 플래그 찾으면 될 것 같은 느낌이 든다.
문제 파일 다운로드 했을 때 정보가 많아서 필요한 것만 올려보겠다.
아래는 Dockerfile이다. 살펴보면 웹 문서가 저장되는 위치를 알 수 있다. 아파치에서 사용하는 기본 파일 위치를 그대로 사용하고 있다.
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install -y zip unzip tzdata curl
RUN apt-get install -y php5
RUN apt-get install -y apache2 libapache2-mod-php5
RUN rm /var/www/html/index.html
COPY ./src /var/www/html/
RUN chmod 777 /var/www/html/upload/
COPY ./run-lamp.sh /usr/sbin/
COPY ./000-default.conf /etc/apache2/sites-enabled/
RUN a2enmod rewrite
RUN chmod +x /usr/sbin/run-lamp.sh
# FLAG
COPY ./flag.c /flag.c
RUN apt install -y gcc \
&& gcc /flag.c -o /flag \
&& chmod 111 /flag && rm /flag.c
EXPOSE 80
CMD ["/usr/sbin/run-lamp.sh"]
아래는 upload.php파일이다. 아래를 살펴보면 $deniedExts을 통해 해당 확장자가 입력되면 " extension file is not allowed to upload ! "문자열이 출력되는 것 같다. 또한 파일이 업로드되면 /upload 디렉토리에 저장한다. 절대경로로 따져보면 /var/www/html/upload에 저장된다.
<?php
$deniedExts = array("php", "php3", "php4", "php5", "pht", "phtml");
if (isset($_FILES)) {
$file = $_FILES["file"];
$error = $file["error"];
$name = $file["name"];
$tmp_name = $file["tmp_name"];
if ( $error > 0 ) {
echo "Error: " . $error . "<br>";
}else {
$temp = explode(".", $name);
$extension = end($temp);
if(in_array($extension, $deniedExts)){
die($extension . " extension file is not allowed to upload ! ");
}else{
move_uploaded_file($tmp_name, "upload/" . $name);
echo "Stored in: <a href='/upload/{$name}'>/upload/{$name}</a>";
}
}
}else {
echo "File is not selected";
}
?>
이 외에도 다른 파일들이 많지만 해당 정보만으로 문제를 풀 수 있을 것 같다. 확장자 문자열 검사를 우회하고 웹셸을 업로드해서 아파치 서버의 설정파일들을 살펴보면 플래그가 나올 것 같다. 풀어보자.
실험적으로 hello.txt파일을 업로드 해보겠다.
잘 나온다. php 확장자를 가진 파일도 업로드 해봤더니
생각한 대로 나온다. 강의에서 배운 내용으로 "webshell.ph.phpp"으로 "php"검색을 우회하는 방법은 해당 문자열이 확인되면 오류 메세지를 출력하기 때문에 안될 것 같다.
그냥 한 번 해봤는데 왜 되는건지 모르겠다..ㅋㅋ 웹 셸에서 "ls", "ls -al", "dir" "pwd"등 다 쳐봤는데 출력되는게 없다.(운영체제는 리눅스인데 dir은 왜 쳐 봤을까) 일단 플래그만 알면 되니까 문제 파일에 있는 파일들을 살펴보다가 Dockerfile에서 플래그 위치를 찾았다.
# FLAG
COPY ./flag.c /flag.c
RUN apt install -y gcc \
&& gcc /flag.c -o /flag \
&& chmod 111 /flag && rm /flag.c
/flag.c에 있는 프로그램을 컴파일하여 /flag 프로그램을 만들었다. 그리고 chmod 111을 통해서 모든 사용자에게 실행 권한을 보여하고 ./flag.c파일을 삭제하는 것을 볼 수 있다. 상위 디렉토리에 가서 /flag파일만 실행시키면 답이 나올 것 같다.
"cd ../../../../../flag"를 해도 출력값이 없다. 시간 아까우니까 질문을 봤고 권한에 대한 내용이 있었다.권한이 없어서 명령어를 실행해도 출력값이 없는건가 싶다. curl 명령어로도 안돼서 nc 명령어를 통해 연결해보기로 했다. 리눅스에서 netcat을 사용해서 포트를 열려고 했는데 포트가 열려있는지 확인할 수가 없어서 현재 내 컴퓨터(window)에서 포트를 열고 접속을 해보려고 했는데 포트포워딩을 해야한다고 한다.(근데 윈도우에서 포트를 열고 리눅스에서 접속한 후에 리눅스에서 입력한 명령어의 출력값이 윈도우 CMD창에서 보일지는 모르겠다.)
포트포워딩이란 외부 기기가 내부 서버로 접속하려면 내부 서버에서 사용하는 공유기에서 방화벽 역할을 하기 때문에 공유기 설정을 통해 IP와 포트의 접속을 허용 할 수 있는데 이 과정을 말한다. 지금은 도서관이라서 집에가서 해봐야겠다.
집 가기 전에 생각해봤는데 아무래도 내가 생각한 방식으로 접근하는 것은 아닌 것 같아서 인터넷에서 문제풀이를 뒤져봤다.
문제 제목이 htaccess인데 활용할 생각은 1도 안했던 것 같다. 풀이 과정을 보는데 아무리 고민해도 못 풀었을 것 같아서 후회는 없다.
https://hackmd.io/@JeremyLim/By8VcrUFo
Dreamhack - Apache htaccess (WEB) - HackMD
# Dreamhack - Apache htaccess (WEB) 해당 문제는 파일 업로드 조건을 우회하는게 핵심이다. 문제의 언어는 PHP로 작성되어 있는데, 필터링 규칙이 다음
hackmd.io
문제 풀 때 찾아봤던 블로그이다.
'문제풀이 > 웹해킹' 카테고리의 다른 글
[dreamhack] command-injection-chatgpt 문제풀이 (0) | 2024.05.08 |
---|---|
[dreamhack] simple_sqli_chatgpt 문제풀이 (0) | 2024.05.08 |
[dreamhack] random-test 문제풀이 (1) | 2024.05.01 |
(dreamhack) sql injection bypass WAF Advanced 문제풀이 (0) | 2023.02.11 |
(dreamhack) blind sql injection advanced 문제풀이 (2) | 2023.02.08 |