▼ 아래의 강의를 활용해 학습 및 정리하였습니다. ▼

https://inf.run/zmPL

 

인프런 - 라이프타임 커리어 플랫폼

프로그래밍, 인공지능, 데이터, 마케팅, 디자인, 엑셀 실무 등 입문부터 실전까지 업계 최고 선배들에게 배울 수 있는 곳. 우리는 성장 기회의 평등을 추구합니다.

www.inflearn.com


volatility

  • 메모리 포렌식 도구
  • 오픈소스
  • CLI 인터페이스 (명령어를 입력하는 방식) (<-> GUI 인터페이스)
  • volatility에서 증거를 획득할 수 있는 이유
    • 메모리: 프로세스가 마음대로 사용할 수 있는 공간
    • 규칙적인 구조체가 메모리 안에 존재할 경우 그를 가져와서 보여주는 도구가 볼라틸리티, 그러나 기본적인 기능들만으로 모든 구조를 다 가져올 수는 없다.
    • 분석가의 역량에 따라 획득 가능한 증거의 양이 천차만별

volatility 명령어 정리

  • 운영체제 식별
    • imageinfo : 메모리 덤프의 운영체제를 식별
  • 프로세스 검색
    • pslist: 시간 순서대로 보여줌
    • psscan: 숨겨진 프로세스 출력 가능
    • pstree: PID, PPID 기준으로 구조화하여 보여줌(가시성이 높음)
    • psxview: pslist, psscan을 포함한 도구들의 결과를 한 눈에 볼 수 있음
  • 네트워크 분석
    • netscan
      • Windows 7 이상에서 동작
      • TCP, UDP / IPv4, IPv6 지원
      • Listening(소켓 열고 있는 상태), Established(소켓 열려 통신 중인 상태), Closed(소켓 닫힌 상태)
    • Connections
      • Windows 7 미만에서 동작
      • 현재 연결된 TCP 통신에 대한 정보 (Established에 대해서만) 출력
    • Sockets
      • Windows 7 미만에서 동작
      • TCP, UDP를 포함한 모든 프로토콜
      • 현재 Listening 상태에 있는 소켓을 출력
  • CMD 분석
    • cmdscan: 콘솔에 입력한 값들을 볼 수 있음
    • consoles: 콘솔에 입력한 값, 출력한 값들을 볼 수 있음
    • cmdline: 프로세스가 실행될 때의 인자값을 확인할 수 있음 (실행 시의 초기값 확인)
  • 파일 분석 및 덤프
    • filescan: 메모리 내에 존재하는 모든 파일의 리스트 출력
    • dumpfiles: 파일을 덤프, 옵션으로 메모리 주소, 프로세스 줄 수 있음 (P옵션 사용하면 해당 프로세스가 사용하는 모든 프로세스를 다 뽑아줌)
  • 프로세스 세부 분석
    • memdump: 특정 프로세스의 메모리 영역을 덤프 → strings 사용 (의미 있는 문자열들을 뽑아주는 명령어. 이를 통해 메모 파일로 만들어 분석할 수 있음)
    • procdump: 프로세스의 실행 파일을 추출 
  • 악성 프로그램 식별
    • virustotal 주로 사용
    • Windows Defender(윈도우즈 기본 백신 프로그램)도 정확한 편

 


 

Volatility Cridex 정리

  • 운영체제 식별
    • WinXPSP2x86
  • 프로세스 검색
    • reader_sl.exe(1640)가 수상한 프로세스
  • 네트워크 분석
    • 공격자 IP: 42.168.5.140:8080
    • PID: 1484(explorer.exe)
  • CMD 분석 → 결과 없음
  • 파일 분석 및 덤프
    • filescan 결과로부터 reader_sl.exe 추출
    • dumpfiles 이용하여 추출 → Virustotal 검색 → 애매
  • 프로세스 세부 분석
    • procdump 이용하여 reader_sl.exe 실행파일 추출 → Virustotal 검색 → 악성 프로세스 발견
    • memdump 이용하여 reader_sl.exe 메모리 영역 덤프 → strings 명령어 이용 → 수상한 URL 발견

 

분석 결과 

  • 침입 경로
    • 확인 불가
  • 악성 행위
    • 악성 프로세스 'reader_sl.exe' (PID: 1640) 식별
    • 외부 통신 IP '41.168.5.140:8080' 발견
    • 프로세스 덤프 후 Virustotal 검색 결과 → 악성 프로세스 확인
    • 프로세스 메모리 덤프 내부에서 수상해 보이는 단서 확보
  • 추가 공격
    • 확인 불가

추가 분석 가능한 부분들

  • explorer.exe 프로세스 분석
  • IP 추적 → Whois 조회 (어떤 사람의 IP인지)
  • 레지스트리 추출 - 자동 실행 관련 분석
  • explorer.exe 메모리 덤프 내부에 웹페이지 소스코드(HTML) 분석

나는 아직 이만큼의 실력이 되지 못하기 때문에... 실제로 해 보진 않고 알아만 두기. 

 


 

GrrCon 2015 정리

  • 운영체제 식별
    • Win7SP1X86
  • 프로세스 검색
    • Teamviewer 관련 프로세스 (tv_w32.exe)
    • explorer 하위 프로세스 (mstsc.exe, OUTLOOK.exe)
    • 인터넷 익스플로러 (iexplorer.exe, cmd.exe)
  • 네트워크 분석
    • 공격자 IP: 180.76.254.120:22
    • PID: 2996(iexplorer.exe)
  • CMD 분석
    • cmdscan, consloes → 악성 실행파일 발견 (wce.exe)
  • 파일 분석
    • wce.exe: 관리자 계정을 포함하여 패스워드를 가져오는 실행파일
    • w.tmp: wce.exe의 실행 결과로 출력된 파일
    • AnyConnectInstaller.exe: Outlook 메일로부터 출력된 실행파일
  • 프로세스 세부 분석
    • Outlook.exe의 메모리 덤프로부터 피싱 메일 발견 + AnyConnectInstaller.exe의 URL 확보
    • iexplorer.exe 메모리 덤프로부터 공격의 흔적 발견
    • Teamviewer 관련 프로세스는 정상 프로세스로 판단

분석 결과

  • 침입 경로
    • Outlook 피싱 메일을 통해 AnyConnectInstaller.exe 다운로드를 유도
  • 악성 행위
    • AnyConnectInstaller.exe 실행파일 발견
    • iexplorer.exe 내부에서도 공격 흔적 발견
    • wce.exe를 통해 관리자 패스워드 가져오고 w.tmp 파일로 저장
  • 추가 공격
    • mstsc를 이용한 추가 공격 예상

 

OlympicDestroyer - Volatility Contest 2018

시나리오 - 상황 이해에 도움

  • 2018 평창올림픽에 OlympicDestroyer라는 악성코드가 유포. 
  • 보안팀이 최초 감염 PC를 덤프. 첨부파일을 통해 감염된 것으로 추정

 

* 스피어 피싱 - 특정 타겟 정해둔 해킹

 

단서

  • 첨부파일 V10 "Olympic_Session_V10"
  • 메일을 통해 감염됨

명령어

  • imageinfo

 

  • pstree

pstree.log

  • 9번째 줄의 OlympicDestroy라는 악성 코드가 아래 3개의 프로세스를 만들어서 각 프로세스가 악성 행위를 한 것으로 추정. 
  • 18번째 줄의 OSPPSVC.EXE는 ms오피스 관련 프로세스. 엑셀을 통해 침입했다면 이것도 의심해 볼 수 있다
  • 33번째 줄의 taskeng.exe는 작업 스케줄러 서비스.  악성코드가 컴퓨터에 들어와 본인 파일을 작업스케줄러에 등록해 지속적으로 사용되도록 하는 경우 있음. 이것도 의심해 볼 수 있다. 
  • pslist
  • 37번째 행 OSFFSVC.EXE 파워셸과 인접한 시간에 동작. 만약 문서 관련 악성코드라면 해당 문서가 파워셸을 실행했을 가능성. 
  • 시간 텀도 주의깊게 봐야 함. 
  • psscan
  • 출력된 내용 없음.
  • psxview
  • psscan의 출력된 내용 없으므로, 이 내용 역시 의미가 없어진다. 

 

  • netscan
  • 사실상 얻을 수 있는 정보는 크게 없음
  • 192.168.111.130 - 로컬 IP
  • 192.168.111.128 - 원격 IP
  • cmdline

  • OlympicDestroyer3 경로

  • pstree에서 의심됐던, OlympicDestroyer 하위의 exe 파일 경로.
  • cmdscan
  • consoles
  • cmdscan보다 consoles가 더 자세하게 나와있음.

  • conhost라는 프로세스가 파워셸 실행했다. 그럼 conhost는 누가 실행했지? 
  • conhost는 콘솔 호스트. 

pslist.log

  • csrss.exe가 conhost를 실행함. csrss는 클라이언트/서버 런타임 프로세스라고 함. 크게 의심스럽진 않다.
  • filescan
  • filescan에서 추출할 파일 이름 검색해 그의 16진수 부분을 복사한 내용으로 파워셸에서 추출해내는 것. 
  • OlympicDestroyer3의 경로를 추출. (파워셸에서 mkdir로 dumps, files 만들어 주고 dumpfile에서 q옵션 사용해 offset 줌. n옵션 주고 D옵션 사용해 dump.dir 줘서 파일 추출. 
  • _xut.exe의 경로를 추출. 
  • 추출해서 나온 files 파일(dat이나 img)을 'virustotal'이라는 웹사이트에 던져서 악성코드 검사.
    • _xut과 olympicdstroyer3 모두 악성 프로세스인 것 확인.
  • dumpfiles
  • procdump
  • memdump
  • Virustotal
  • strings

 

.dat와 .img의 차이점: dat는 데이터 섹션 오브젝트라는 곳에서 데이터 빼 오는 것, img는 이미지 섹션 오브젝트라는 곳에서 데이터 빼오는 것. 서로 추출 방식이 다른 것임. 내용적 차이는 크게 없다. 


Q. Windows 7 이상에서 동작하는 Volatility 네트워크 분석 명령어는?

A. netscan

 

Q. volatility 수행할 때 어떤 단계로 파악해야 하는가?

A. 어떤 경로로 해커가 들어왔는지, 

 

Q. memdump를 strings 할 수 없는 이유는?  (자세하게 말하면, 가능은 하지만 해당 영상에서 시행하지 않은 이유는?)

A. 크기가 너무 컸기 때문. 

 

Q. 악성 프로그램인지 식별할 때 사용하는 프로그램 2개는 무엇인가?

A. Virustotal, Windows defender

'SWUFORCE > 디지털 포렌식' 카테고리의 다른 글

디지털 포렌식_06  (0) 2024.07.03
디지털 포렌식_05  (0) 2024.05.21
디지털 포렌식_04  (0) 2024.05.15
디지털 포렌식_02  (0) 2024.04.02
디지털 포렌식_01  (1) 2024.03.26

문제 설명


두 개의 input값을 입력할 수 있는 탭과 상단 index page가 눈에 띈다.

index page는 클릭해도 별다른 변화가 있진 않고, input값에 임의의 숫자를 넣어 제출해 보니

이렇게 다시 하라는 메시지만 표시된다.

이때 index page를 클릭하니 다시 초기 화면으로 이동한다. 

 

문제에 첨부되어 있는 파일은 총 3개였다. 

check.php
flag.php
index.php

flag.php와 index.php 파일은 문제 풀이에 있어 그닥 중요한 내용은 아닌 것 같다. 

 

check.php의 마지막 부분에 있는 조건문이 중요한 것 같으니 구체적으로 살펴 보았다.

if($input_1 != "" && $input_2 != ""){
        if(strlen($input_1) < 4){
          if($input_1 < "8" && $input_1 < "7.A" && $input_1 > "7.9"){
            if(strlen($input_2) < 3 && strlen($input_2) > 1){
              if($input_2 < 74 && $input_2 > "74"){
                echo "</br></br></br><pre>FLAG\n";
                echo $flag;

우선 input_1의 길이는 4 미만이다.

또한 input_1은 문자열 '7.A'보다 작으며, 문자열 '7.9'보다는 크다. 

'7.9' < input_1 < '7.A'

문자열 7.9를 십진수로 바꿔주면 55 46 57이고 7.A를 십진수로 바꿔주면 55 46 65이다. 두 수 사이의 임의의 수인 55 46 60을 다시 문자열로 변환해 보면 7.<이 나온다.  (이외에도 55 46 58을 변환한 7.<, 55 46 63을 변환한 7.?도 가능한 것으로 확인됐다.)

 

input_2는 숫자 74보다는 작고 문자열 '74'보다는 크다. 

'74' < input_2 < 74

문자열 74를 십진수로 변환하면 55 52라는 값이 나온다. 74와 55 52 사이 임의의 값인 58 59을 문자열로 변환해 보면 :;이 나온다. 

 

각각의 input값을 입력해 보면 

위와 같이 플래그가 발견된다. 

'SWUFORCE > 워게임 풀이' 카테고리의 다른 글

[Dreamhack] devtools-sources (web)  (0) 2024.05.14
[Dreamhack] phpreg (web)  (0) 2024.05.07
[Dreamhack] Carve Party (web)  (0) 2024.05.01
[Dreamhack] simple-web-request (web)  (0) 2024.05.01
[Dreamhack] Flying Chars  (0) 2024.04.02

문제 설명

 


문제 파일의 압축을 풀어 보면 jack-o-lantern이라는 html 파일이 나온다. 

접속해 보면 커다란 호박 그림과 함께 10000번 클릭하라는 메시지가 나온다. 실제로 호박을 클릭하면 하단의 메시지 숫자가 하나씩 작아진다. 

 

html 코드를 열어 보았다. 

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>do you want to build a jack-o-lantern?</title>
        <style>
            html, body {
                margin: 0;
                padding: 0;
                width: 100%;
                height: 100%;
            }

            .jack {
                display: flex;
                flex-direction: column;
                align-items: center;
                justify-content: center;
                width: 100%;
                height: 100%;
            }

            .jack svg {
                width: 50%;
                cursor: pointer;
            }

            #jack-target {
                cursor: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='42' height='50' viewport='0 0 100 100' style='fill:black;font-size:25px;'><text y='50%'>🗡️</text></svg>") 16 0, auto;
            }

            .tada {
                animation: 1s tada infinite;
            }

            @keyframes tada {
                0% {
                    transform: scale(1);
                }

                50% {
                    transform: scale(1.1);
                }

                100% {
                    transform: scale(1);
                }
            }
        </style>
    </head>
    <body>
        <div class="jack">
            <h1>click the pumpkin to make a jack-o-lantern!</h1>
            <!-- openmoji.org -->
            <svg id="jack-target" viewBox="0 0 72 72" version="1.1" xmlns="http://www.w3.org/2000/svg">
                <path fill="#5C9E31" d="M47.8995,9.1325c0.0036-0.0902-0.0177-0.1854-0.02-0.277c-0.0012-0.1675-0.0161-0.3359-0.0366-0.5069 c-0.0126-0.0909-0.0187-0.1795-0.0366-0.2709c-0.0589-0.33-0.1401-0.6613-0.267-0.9896c-1.4448-3.7362-5.9587-4.9144-9.2682-2.8591 c-2.5414,1.5789-3.9725,4.4725-4.8703,7.2267c-0.8674,2.6562-1.3688,5.4905-1.5359,8.3c0.0057-0.0012,0.0123-0.002,0.0179-0.0032 c-0.0017,0.0278-0.0058,0.0557-0.0074,0.0834c0.8161-0.1688,1.7649-0.2942,2.8594-0.3484c0.0019-0.0265,0.006-0.053,0.0079-0.0795 c0.3639-0.0173,0.7436-0.0267,1.1403-0.0267c1.7114,0,3.1121,0.1713,4.2474,0.4241c-1.1245-2.8896-1.9282-6.282-1.0305-9.1633 c0.3867-1.2377,1.0952-2.5057,2.3122-3.1451c1.3619-0.7169,3.4476-0.1575,2.9586,1.75c-0.0953,0.373-0.4211,0.5609-0.616,0.8633 c-0.8978,1.3881,0.3412,2.3164,1.652,1.9849c1.6414-0.4139,2.4005-1.6262,2.4636-3.0253 C47.8793,9.0915,47.8909,9.1107,47.8995,9.1325z"/>
                <path fill="#F4AA41" d="M26.6422,19.7574c0.0035-0.0016,0.0068-0.0037,0.0103-0.0053c-0.1259-0.0449-0.25-0.0787-0.3753-0.1198 c-0.1509-0.0496-0.3019-0.1002-0.4519-0.1443c-0.1786-0.0525-0.3558-0.0975-0.533-0.1425 c-0.1506-0.0382-0.3013-0.0776-0.4509-0.1104c-0.1745-0.0383-0.3475-0.0692-0.5206-0.1003 c-0.1498-0.0269-0.2999-0.0552-0.4486-0.0767c-0.1706-0.0247-0.3394-0.0422-0.5086-0.0601 c-0.1487-0.0157-0.2977-0.0329-0.4453-0.0434c-0.1665-0.0119-0.3312-0.0167-0.4962-0.022c-0.147-0.0048-0.2944-0.011-0.4402-0.0107 c-0.1638,0.0004-0.3257,0.0078-0.4879,0.0145c-0.1439,0.006-0.288,0.0103-0.4306,0.0211c-0.161,0.0123-0.3202,0.0314-0.4795,0.0498 c-0.1407,0.0162-0.2819,0.0308-0.4213,0.0517c-0.1581,0.0237-0.3139,0.0543-0.4701,0.0839 c-0.1374,0.0261-0.2751,0.0503-0.411,0.0808c-0.1557,0.035-0.309,0.0767-0.4628,0.1175c-0.1331,0.0353-0.2668,0.0686-0.3984,0.1082 c-0.1534,0.0461-0.3042,0.0988-0.4555,0.1504c-0.1284,0.0438-0.2575,0.0856-0.3843,0.1334 c-0.1512,0.0569-0.2998,0.1205-0.4488,0.183c-0.1235,0.0518-0.2477,0.1014-0.3696,0.1569 c-0.1494,0.0679-0.2958,0.1423-0.4428,0.2157c-0.1176,0.0587-0.2362,0.1152-0.3523,0.1773 c-0.1473,0.0788-0.2915,0.1639-0.4362,0.248c-0.1122,0.0652-0.2254,0.1281-0.3361,0.1964 c-0.1448,0.0894-0.2864,0.1851-0.4285,0.2797c-0.1065,0.0709-0.2142,0.1396-0.3192,0.2134 c-0.1428,0.1003-0.2821,0.2067-0.4219,0.3123c-0.0999,0.0754-0.2012,0.1484-0.2996,0.2263 c-0.1401,0.1109-0.2764,0.2277-0.4134,0.3436c-0.0945,0.08-0.1905,0.1577-0.2835,0.24c-0.1364,0.1207-0.2689,0.2471-0.402,0.3727 c-0.0889,0.0839-0.1794,0.1655-0.2668,0.2515c-0.134,0.1318-0.2639,0.269-0.3943,0.4057c-0.082,0.0858-0.1656,0.1693-0.2461,0.257 c-0.1306,0.1422-0.2568,0.2896-0.3837,0.4365c-0.0761,0.0881-0.1541,0.1739-0.2287,0.2637 c-0.1258,0.1512-0.247,0.3074-0.3689,0.463c-0.071,0.0907-0.144,0.1792-0.2136,0.2714c-0.1213,0.1606-0.2376,0.3259-0.3546,0.4906 c-0.0653,0.0919-0.1328,0.1818-0.1967,0.2751c-0.1155,0.1685-0.226,0.3414-0.337,0.5138 c-0.0607,0.0942-0.1237,0.1865-0.1831,0.2819c-0.1089,0.175-0.2125,0.3542-0.3168,0.533 c-0.0565,0.0969-0.1155,0.1919-0.1706,0.2898c-0.1023,0.1816-0.1989,0.3669-0.2965,0.5518 c-0.0519,0.0984-0.1064,0.1952-0.1569,0.2946c-0.0964,0.1894-0.1867,0.3821-0.278,0.5746 c-0.0465,0.0981-0.0957,0.1948-0.1409,0.2936c-0.0875,0.1917-0.169,0.3862-0.2514,0.5805 c-0.0438,0.1032-0.0904,0.205-0.1327,0.3089c-0.0831,0.2042-0.16,0.411-0.2374,0.6177c-0.0357,0.0952-0.0742,0.189-0.1087,0.2847 c-0.0733,0.2036-0.1399,0.4095-0.2076,0.6152c-0.0338,0.1027-0.0707,0.2042-0.1031,0.3073 c-0.0641,0.2042-0.1213,0.4104-0.1798,0.6162c-0.0298,0.105-0.0629,0.209-0.0912,0.3145c-0.0581,0.2161-0.1092,0.4339-0.161,0.6514 c-0.023,0.0966-0.0494,0.1924-0.0711,0.2893c-0.0527,0.2349-0.098,0.4709-0.1432,0.7069 c-0.0154,0.0805-0.0342,0.1605-0.0487,0.2411c-0.051,0.2827-0.0947,0.5662-0.1347,0.8497 c-0.0048,0.0343-0.0116,0.0685-0.0163,0.1028c-0.3012,2.2099-0.2696,4.4514,0.076,6.6451 c0.1729,1.0981,0.4187,2.1852,0.7521,3.2487c0.4583,1.4606,1.0642,2.8831,1.7966,4.2331c0.6502,1.1984,1.3989,2.3402,2.2521,3.3903 c0.0835,0.1027,0.1737,0.1989,0.259,0.2999c0.1797,0.2126,0.3576,0.4269,0.5455,0.6316c0.0008,0.0009,0.0015,0.0016,0.0023,0.0024 c0.2523,0.2747,0.5026,0.5352,0.7516,0.787c0.0829,0.0839,0.165,0.1624,0.2476,0.2438c0.1679,0.1655,0.3353,0.3282,0.5015,0.4839 c0.0938,0.0877,0.1868,0.1724,0.28,0.257c0.1547,0.1404,0.3085,0.2768,0.4616,0.4089c0.0943,0.0813,0.1883,0.1623,0.2819,0.2404 c0.158,0.1319,0.3145,0.2576,0.4708,0.3809c0.083,0.0656,0.1665,0.1335,0.2491,0.1966c0.2084,0.1595,0.4152,0.3112,0.6203,0.4559 c0.0272,0.0192,0.055,0.0409,0.0822,0.0599c0.2303,0.1606,0.4578,0.3104,0.6835,0.4533c0.0784,0.0496,0.1554,0.0947,0.2332,0.1422 c0.1491,0.0911,0.2977,0.1804,0.4447,0.264c0.0888,0.0506,0.1768,0.0985,0.2649,0.1464c0.1353,0.0737,0.2697,0.1446,0.4031,0.2122 c0.0882,0.0447,0.1761,0.0889,0.2634,0.131c0.136,0.0656,0.2705,0.127,0.4043,0.1865c0.079,0.0352,0.1584,0.0719,0.2367,0.105 c0.1684,0.0712,0.3347,0.1367,0.4996,0.1988c0.0403,0.0152,0.0815,0.0329,0.1216,0.0475c0.2014,0.0737,0.3996,0.1396,0.5952,0.2003 c0.0689,0.0214,0.1362,0.0394,0.2044,0.0592c0.1293,0.0377,0.2579,0.0742,0.3846,0.1066c0.0772,0.0197,0.1531,0.0375,0.2293,0.0553 c0.1164,0.0272,0.2316,0.0527,0.3457,0.0757c0.0753,0.0152,0.1501,0.03,0.2243,0.0433c0.1163,0.021,0.2306,0.0392,0.3442,0.0561 c0.0658,0.0098,0.1322,0.0206,0.1972,0.0291c0.14,0.0182,0.2772,0.0324,0.4129,0.0447c0.0353,0.0032,0.0719,0.0081,0.1069,0.0109 c0.1683,0.0135,0.3325,0.0222,0.4938,0.0273c0.0517,0.0016,0.1014,0.0013,0.1524,0.0021c0.111,0.0019,0.2208,0.0028,0.3282,0.0012 c0.058-0.0009,0.1144-0.0029,0.1713-0.0048c0.0989-0.0033,0.1963-0.0076,0.2919-0.0136c0.0549-0.0034,0.1092-0.0071,0.1631-0.0114 c0.0978-0.0078,0.1932-0.0172,0.2873-0.0275c0.0454-0.0049,0.0914-0.0094,0.1358-0.015c0.1164-0.0145,0.2295-0.0309,0.3399-0.0487 c0.0189-0.0031,0.039-0.0054,0.0577-0.0086c0.1305-0.0219,0.2561-0.046,0.3778-0.0716c0.0274-0.0058,0.053-0.0122,0.08-0.0181 c0.0928-0.0204,0.1835-0.0415,0.2709-0.0636c0.0342-0.0087,0.067-0.0175,0.1003-0.0264c0.0787-0.0209,0.1552-0.0421,0.2292-0.064 c0.03-0.0089,0.0594-0.0175,0.0885-0.0265c0.0775-0.0237,0.1517-0.0477,0.2235-0.0719c0.0207-0.007,0.0419-0.0137,0.062-0.0208 c0.1862-0.0645,0.3523-0.129,0.4965-0.1904c0.0011-0.0005,0.002-0.0009,0.0031-0.0014c0.0535-0.0228,0.1055-0.0453,0.153-0.0669 c0,0-0.0007-0.0005-0.001-0.0007c0.3469-0.1577,0.5346-0.278,0.5346-0.278c1.4692,1.4635,7.6696,1.7152,8.0888,1.7307 c0.0154,0.0005,0.0293,0.0005,0.0447,0c0.4192-0.0154,6.6196-0.2672,8.0888-1.7307c0,0,6.8438,4.4366,15.5886-5.0859 c7.0378-7.0443,7.9-20.5231,2.0165-28.6674c-0.5543-0.7675-1.1686-1.4874-1.8432-2.1503 c-1.0616-1.0431-2.2445-1.9655-3.5286-2.7019c-3.6327-2.0837-7.8248-2.3765-11.7263-0.8917c0,0-2.0279-2.4888-8.6181-2.4888 s-8.6181,2.4888-8.6181,2.4888C26.8595,19.8278,26.7515,19.7963,26.6422,19.7574"/>
                <path fill="#E27022" d="M44.5882,59.6454c1.7503,0.8029,7.6702,2.5917,14.9042-5.3642c2.1951-2.4146,3.8261-5.4041,4.805-8.5551 c0.9897-3.1884,1.2669-6.5781,0.8197-9.8944c-1.3646-10.1149-9.7316-19.8646-20.2419-16.0795 c5.7584,2.7111,9.8136,9.4387,10.743,16.3279c0.4653,3.4475,0.176,6.9711-0.8522,10.2849 c-1.0174,3.2764-2.7123,6.3828-4.9942,8.8938C47.949,57.2634,46.207,58.6726,44.5882,59.6454z"/>
                <path fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="2" d="M39.4,17.6598c-0.68-2.34-0.98-4.83-0.3-7.02c0.39-1.24,1.1-2.5,2.31-3.14c1.36-0.72,3.45-0.16,2.96,1.75 c-0.09,0.37-0.42,0.56-0.62,0.86c-0.89,1.39,0.35,2.32,1.66,1.99c1.64-0.42,2.4-1.63,2.46-3.03c0.01,0.02,0.02,0.04,0.03,0.06 c0-0.09-0.02-0.18-0.02-0.27c0-0.17-0.02-0.34-0.04-0.51c-0.01-0.09-0.02-0.18-0.03-0.27c-0.06-0.33-0.14-0.66-0.27-0.99 c-1.45-3.74-5.96-4.92-9.27-2.86c-2.54,1.58-3.97,4.47-4.87,7.23c-0.66,2.01-1.11,4.13-1.36,6.26"/>
                <path fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="2" d="M7.1349,33.9318c-0.0522,0.2349-0.097,0.4709-0.1418,0.7069c-0.0153,0.0805-0.0338,0.1605-0.0482,0.2411 c-0.0505,0.2827-0.0938,0.5662-0.1334,0.8497C6.8067,35.7638,6.8,35.798,6.7954,35.8323 c-0.2982,2.2099-0.2669,4.4514,0.0752,6.6451c0.1711,1.0981,0.4145,2.1852,0.7446,3.2487 c0.4537,1.4606,1.0535,2.8831,1.7787,4.2331c0.6437,1.1984,1.3849,2.3402,2.2296,3.3903c0.0826,0.1027,0.172,0.1989,0.2564,0.2999 c0.1779,0.2126,0.354,0.4269,0.54,0.6316c0.0008,0.0009,0.0015,0.0016,0.0023,0.0024c0.2498,0.2747,0.4976,0.5352,0.7441,0.787 c0.0821,0.0839,0.1634,0.1624,0.2451,0.2438c0.1662,0.1655,0.332,0.3282,0.4965,0.4839c0.0928,0.0877,0.1849,0.1724,0.2772,0.257 c0.1531,0.1404,0.3054,0.2768,0.457,0.4089c0.0933,0.0813,0.1864,0.1623,0.2791,0.2404c0.1564,0.1319,0.3114,0.2576,0.4661,0.3809 c0.0822,0.0656,0.1649,0.1335,0.2466,0.1966c0.2064,0.1595,0.4111,0.3112,0.6141,0.4559c0.027,0.0192,0.0544,0.0409,0.0814,0.0599 c0.228,0.1606,0.4532,0.3104,0.6767,0.4533c0.0776,0.0496,0.1539,0.0947,0.2309,0.1422c0.1476,0.0911,0.2947,0.1804,0.4402,0.264 c0.088,0.0506,0.175,0.0985,0.2622,0.1464c0.134,0.0737,0.267,0.1446,0.399,0.2122c0.0873,0.0447,0.1744,0.0889,0.2608,0.131 c0.1346,0.0656,0.2678,0.127,0.4003,0.1865c0.0782,0.0352,0.1569,0.0719,0.2343,0.105c0.1667,0.0712,0.3314,0.1367,0.4946,0.1988 c0.0399,0.0152,0.0807,0.0329,0.1204,0.0475c0.1994,0.0737,0.3956,0.1396,0.5893,0.2003c0.0682,0.0214,0.1348,0.0394,0.2023,0.0592 c0.1281,0.0377,0.2554,0.0742,0.3807,0.1066c0.0764,0.0197,0.1516,0.0375,0.2271,0.0553c0.1152,0.0272,0.2293,0.0527,0.3422,0.0757 c0.0745,0.0152,0.1486,0.03,0.222,0.0433c0.1151,0.021,0.2283,0.0392,0.3408,0.0561c0.0652,0.0098,0.1309,0.0206,0.1952,0.0291 c0.1386,0.0182,0.2744,0.0324,0.4088,0.0447c0.035,0.0032,0.0712,0.0081,0.1058,0.0109c0.1666,0.0135,0.3292,0.0222,0.4889,0.0273 c0.0511,0.0016,0.1004,0.0013,0.1509,0.0021c0.1099,0.0019,0.2186,0.0028,0.3249,0.0012c0.0574-0.0009,0.1133-0.0029,0.1696-0.0048 c0.0979-0.0033,0.1943-0.0076,0.289-0.0136c0.0543-0.0034,0.1082-0.0071,0.1614-0.0114c0.0968-0.0078,0.1912-0.0172,0.2844-0.0275 c0.0449-0.0049,0.0905-0.0094,0.1345-0.015c0.1152-0.0145,0.2272-0.0309,0.3365-0.0487c0.0187-0.0031,0.0386-0.0054,0.0571-0.0086 c0.1292-0.0219,0.2535-0.046,0.374-0.0716c0.0272-0.0058,0.0524-0.0122,0.0792-0.0181c0.0919-0.0204,0.1817-0.0415,0.2682-0.0636 c0.0338-0.0087,0.0663-0.0175,0.0993-0.0264c0.0779-0.0209,0.1536-0.0421,0.2269-0.064c0.0297-0.0089,0.0588-0.0175,0.0876-0.0265 c0.0767-0.0237,0.1502-0.0477,0.2213-0.0719c0.0204-0.007,0.0414-0.0137,0.0614-0.0208c0.1843-0.0645,0.3488-0.129,0.4916-0.1904 c0.0011-0.0005,0.002-0.0009,0.0031-0.0014c0.053-0.0228,0.1045-0.0453,0.1515-0.0669c-0.0003-0.0002-0.0007-0.0005-0.001-0.0007 c0.3434-0.1577,0.5293-0.278,0.5293-0.278c1.4545,1.4635,7.593,1.7152,8.0081,1.7307c0.0152,0.0005,0.0291,0.0005,0.0443,0 c0.415-0.0154,6.5535-0.2672,8.0081-1.7307c0,0,6.7755,4.4366,15.4329-5.0859c6.9675-7.0443,7.8211-20.5231,1.9964-28.6674 c-0.5488-0.7675-1.1569-1.4874-1.8248-2.1503c-1.051-1.0431-2.222-1.9655-3.4933-2.7019 c-3.5964-2.0837-7.7466-2.3765-11.6092-0.8917c0,0-2.0076-2.4888-8.532-2.4888s-8.532,2.4888-8.532,2.4888 c-0.1086-0.0417-0.2155-0.0732-0.3237-0.1121"/>
                <path fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="2" d="M27.0273,19.7574c0.0035-0.0016,0.0067-0.0037,0.0102-0.0053c-0.1246-0.0449-0.2475-0.0787-0.3715-0.1198 c-0.1494-0.0496-0.2989-0.1002-0.4474-0.1443c-0.1768-0.0525-0.3522-0.0975-0.5277-0.1425 c-0.1491-0.0382-0.2983-0.0776-0.4464-0.1104c-0.1727-0.0383-0.344-0.0692-0.5154-0.1003 c-0.1483-0.0269-0.2969-0.0552-0.4442-0.0767c-0.1689-0.0247-0.3361-0.0422-0.5035-0.0601 c-0.1472-0.0157-0.2947-0.0329-0.4409-0.0434c-0.1648-0.0119-0.3279-0.0167-0.4912-0.022 c-0.1456-0.0048-0.2914-0.011-0.4358-0.0107c-0.1622,0.0004-0.3224,0.0078-0.483,0.0145c-0.1425,0.006-0.2852,0.0103-0.4263,0.0211 c-0.1594,0.0123-0.317,0.0314-0.4747,0.0498c-0.1393,0.0162-0.2791,0.0308-0.4171,0.0517 c-0.1565,0.0237-0.3108,0.0543-0.4655,0.0839c-0.136,0.0261-0.2724,0.0503-0.4069,0.0808 c-0.1541,0.035-0.3059,0.0767-0.4581,0.1175c-0.1318,0.0353-0.2641,0.0686-0.3945,0.1082 c-0.1519,0.0461-0.3011,0.0988-0.451,0.1504c-0.1271,0.0438-0.2549,0.0856-0.3805,0.1334 c-0.1497,0.0569-0.2968,0.1205-0.4443,0.183c-0.1223,0.0518-0.2452,0.1014-0.3659,0.1569 c-0.1479,0.0679-0.2928,0.1423-0.4384,0.2157c-0.1165,0.0587-0.2339,0.1152-0.3488,0.1773 c-0.1458,0.0788-0.2886,0.1639-0.4318,0.248c-0.1111,0.0652-0.2231,0.1281-0.3327,0.1964 c-0.1434,0.0894-0.2835,0.1851-0.4242,0.2797c-0.1055,0.0709-0.2121,0.1396-0.316,0.2134 c-0.1414,0.1003-0.2792,0.2067-0.4177,0.3123c-0.0989,0.0754-0.1992,0.1484-0.2966,0.2263 c-0.1387,0.1109-0.2736,0.2277-0.4092,0.3436c-0.0936,0.08-0.1886,0.1577-0.2807,0.24c-0.135,0.1207-0.2662,0.2471-0.3979,0.3727 c-0.088,0.0839-0.1776,0.1655-0.2642,0.2515c-0.1327,0.1318-0.2612,0.269-0.3904,0.4057c-0.0812,0.0858-0.1639,0.1693-0.2437,0.257 c-0.1293,0.1422-0.2543,0.2896-0.3798,0.4365c-0.0754,0.0881-0.1525,0.1739-0.2264,0.2637"/>
                <g id="jack-mouth" style="opacity: 0;">
                    <path fill="#FCEA2B" d="M20,48c0,0,15,10,32,0C52,48,36,68,20,48z"/>
                    <path fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="2" d="M20,48c0,0,15,10,32,0C52,48,36,68,20,48z"/>
                </g>
                <g id="jack-nose" style="opacity: 0;">
                    <polygon fill="#FCEA2B" points="35.896,47.9282 34.1847,44.9641 32.4734,42 35.896,42 39.3187,42 37.6073,44.9641"/>
                    <polygon fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="2" points="35.896,47.9282 34.1847,44.9641 32.4734,42 35.896,42 39.3187,42 37.6073,44.9641"/>
                </g>
                <g id="jack-right" style="opacity: 0;">
                    <path fill="#FCEA2B" d="M48.974,37.8449c2.5901-0.9575,3.9136-3.8335,2.956-6.4235l-9.3796,3.4675 C43.508,37.479,46.3839,38.8024,48.974,37.8449z"/>
                    <path fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="2" d="M48.974,37.8449c2.5901-0.9575,3.9136-3.8335,2.956-6.4235l-9.3796,3.4675C43.508,37.479,46.3839,38.8024,48.974,37.8449z"/>
                </g>
                <g id="jack-left" style="opacity: 0;">
                    <path fill="#FCEA2B" d="M22.818,37.8449c-2.5901-0.9575-3.9136-3.8335-2.956-6.4235l9.3796,3.4675 C28.2841,37.479,25.4081,38.8024,22.818,37.8449z"/>
                    <path fill="none" stroke="#000000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="2" d="M22.818,37.8449c-2.5901-0.9575-3.9136-3.8335-2.956-6.4235l9.3796,3.4675C28.2841,37.479,25.4081,38.8024,22.818,37.8449z"/>
                </g>
            </svg>
            <canvas width=720>
                <div class="txtStyle"></div>
            </canvas>
            <p>
                <span id="clicks">10000</span>
                more clicks to go!
            </p>
        </div>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js" integrity="sha512-bLT0Qm9VnAYZDflyKcBaQ2gg0hSYNQrJ8RilYldYQ1FxQYoCLtUjuuRuZo+fjqhx/qtq/1itJ0C2ejDxltZVFg==" crossorigin="anonymous"></script>
        <script>
            var pumpkin = [124, 112, 59, 73, 167, 100, 105, 75, 59, 23, 16, 181, 165, 104, 43, 49, 118, 71, 112, 169, 43, 53];
            var counter = 0;
            var pie = 1;

            function make() {
                if (0 < counter && counter <= 1000) {
                    $('#jack-nose').css('opacity', (counter) + '%');
                } else if (1000 < counter && counter <= 3000) {
                    $('#jack-left').css('opacity', (counter - 1000) / 2 + '%');
                } else if (3000 < counter && counter <= 5000) {
                    $('#jack-right').css('opacity', (counter - 3000) / 2 + '%');
                } else if (5000 < counter && counter <= 10000) {
                    $('#jack-mouth').css('opacity', (counter - 5000) / 5 + '%');
                }

                if (10000 < counter) {
                    $('#jack-target').addClass('tada');
                    var ctx = document.querySelector("canvas").getContext("2d")
                      , dashLen = 220
                      , dashOffset = dashLen
                      , speed = 20
                      , txt = pumpkin.map(x=>String.fromCharCode(x)).join('')
                      , x = 30
                      , i = 0;

                    ctx.font = "50px Comic Sans MS, cursive, TSCu_Comic, sans-serif";
                    ctx.lineWidth = 5;
                    ctx.lineJoin = "round";
                    ctx.globalAlpha = 2 / 3;
                    ctx.strokeStyle = ctx.fillStyle = "#1f2f90";

                    (function loop() {
                        ctx.clearRect(x, 0, 60, 150);
                        ctx.setLineDash([dashLen - dashOffset, dashOffset - speed]);
                        // create a long dash mask
                        dashOffset -= speed;
                        // reduce dash length
                        ctx.strokeText(txt[i], x, 90);
                        // stroke letter

                        if (dashOffset > 0)
                            requestAnimationFrame(loop);
                            // animate
                        else {
                            ctx.fillText(txt[i], x, 90);
                            // fill final letter
                            dashOffset = dashLen;
                            // prep next char
                            x += ctx.measureText(txt[i++]).width + ctx.lineWidth * Math.random();
                            ctx.setTransform(1, 0, 0, 1, 0, 3 * Math.random());
                            // random y-delta
                            ctx.rotate(Math.random() * 0.005);
                            // random rotation
                            if (i < txt.length)
                                requestAnimationFrame(loop);
                        }
                    }
                    )();
                } else {
                    $('#clicks').text(10000 - counter);
                }
            }

            $(function() {
                $('#jack-target').click(function() {
                    counter += 1;
                    if (counter <= 10000 && counter % 100 == 0) {
                        for (var i = 0; i < pumpkin.length; i++) {
                            pumpkin[i] ^= pie;
                            pie = ((pie ^ 0xff) + (i * 10)) & 0xff;
                        }
                    }
                    make();
                });
            });
        </script>
    </body>
</html>

해당 코드를 변형시켜, 10000번 클릭하지 않아도 10000번 클릭한 것 같은 효과를 주어야 플래그를 획득할 수 있을 것 같다.

 

 

 $(function() {
                $('#jack-target').click(function() {
                    counter += 1;
                    if (counter <= 10000 && counter % 100 == 0) {
                        for (var i = 0; i < pumpkin.length; i++) {
                            pumpkin[i] ^= pie;
                            pie = ((pie ^ 0xff) + (i * 10)) & 0xff;
                        }
                    }
                    make();

클릭과 관련된 코드 부분은 여기다.

클릭할 때마다 counter를 1씩 증가시켜, counter가 10000에 도달하면 플래그가 등장하게끔 변형이 필요하다. 

 

$(function() {
  $('#jack-target').click(function () {
    counter += 10000;
    if (counter <= 10000 && counter % 100 == 0) {
      for (var i = 0; i < pumpkin.length; i++) {
        pumpkin[i] ^= pie;
        pie = ((pie ^ 0xff) + (i * 10)) & 0xff;
      }
    }
    make();

counter에 1씩 더하는 것이 아니라, 한 번 클릭에도 10000만큼 더해지도록 코드 수정을 하고 다시 시도해 봤다. 

왠지 잘못된 것 같다...

 

$(function() {
  $('#jack-target').click(function () {
    while(counter<=10000){
		counter += 1;
		if (counter <= 10000 && counter % 100 == 0) {
		  for (var i = 0; i < pumpkin.length; i++) {
			pumpkin[i] ^= pie;
			pie = ((pie ^ 0xff) + (i * 10)) & 0xff;
		  }
		}
	}
    make();

접근 방법이 아무래도 잘못 됐던 것 같아서, 무작정 숫자를 늘리는 것이 아니라 반복문 형태로 다시 수정해 보았다.

이렇게 수정하고 다시 실행해 보니

정상적인 형태로 플래그가 출력됐다.

DH{I_lik3_pumpk1n_pi3}

'SWUFORCE > 워게임 풀이' 카테고리의 다른 글

[Dreamhack] phpreg (web)  (0) 2024.05.07
[Dreamhack] php7cmp4re (web)  (0) 2024.05.07
[Dreamhack] simple-web-request (web)  (0) 2024.05.01
[Dreamhack] Flying Chars  (0) 2024.04.02
[Dreamhack] ex-reg-ex(web)  (0) 2024.04.02

문제 설명 


웹 서버에 접속하니 위와 같이 총 세 가지의 사이트에 접속할 수 있게끔 표시가 된다. 

문제 설명에 나와 있듯이 STEP 1과 STEP 2을 거쳐야 Flag를 획득할 수 있다.

아직 STEP 1을 수행하지 못했기 때문에 STEP 2 페이지는 접속조차 되지 않는다.  

 

step 1

 

파이썬 코드를 열어서 살펴 보면 아래와 같다. 

#!/usr/bin/python3
import os
from flask import Flask, request, render_template, redirect, url_for
import sys

app = Flask(__name__)

try: 
    # flag is here!
    FLAG = open("./flag.txt", "r").read()      
except:
    FLAG = "[**FLAG**]"


@app.route("/")
def index():
    return render_template("index.html")


@app.route("/step1", methods=["GET", "POST"])
def step1():

    #### 풀이와 관계없는 치팅 방지 코드
    global step1_num
    step1_num = int.from_bytes(os.urandom(16), sys.byteorder)
    ####

    if request.method == "GET":
        prm1 = request.args.get("param", "")
        prm2 = request.args.get("param2", "")
        step1_text = "param : " + prm1 + "\nparam2 : " + prm2 + "\n"
        if prm1 == "getget" and prm2 == "rerequest":
            return redirect(url_for("step2", prev_step_num = step1_num))
        return render_template("step1.html", text = step1_text)
    else: 
        return render_template("step1.html", text = "Not POST")


@app.route("/step2", methods=["GET", "POST"])
def step2():
    if request.method == "GET":

    #### 풀이와 관계없는 치팅 방지 코드
        if request.args.get("prev_step_num"):
            try:
                prev_step_num = request.args.get("prev_step_num")
                if prev_step_num == str(step1_num):
                    global step2_num
                    step2_num = int.from_bytes(os.urandom(16), sys.byteorder)
                    return render_template("step2.html", prev_step_num = step1_num, hidden_num = step2_num)
            except:
                return render_template("step2.html", text="Not yet")
        return render_template("step2.html", text="Not yet")
    ####

    else: 
        return render_template("step2.html", text="Not POST")

    
@app.route("/flag", methods=["GET", "POST"])
def flag():
    if request.method == "GET":
        return render_template("flag.html", flag_txt="Not yet")
    else:

        #### 풀이와 관계없는 치팅 방지 코드
        prev_step_num = request.form.get("check", "")
        try:
            if prev_step_num == str(step2_num):
        ####

                prm1 = request.form.get("param", "")
                prm2 = request.form.get("param2", "")
                if prm1 == "pooost" and prm2 == "requeeest":
                    return render_template("flag.html", flag_txt=FLAG)
                else:
                    return redirect(url_for("step2", prev_step_num = str(step1_num)))
            return render_template("flag.html", flag_txt="Not yet")
        except:
            return render_template("flag.html", flag_txt="Not yet")
            

app.run(host="0.0.0.0", port=8000)

코드 내용을 읽다 보니 param과 param2를 직접적으로 알려주는 부분이 있다. 

 

if prm1 == "getget" and prm2 == "rerequest":

이 내용 그대로 키워드를 입력해 보니, 해결이 된 듯 STEP 2로 추정되는 화면이 나타난다. 

STEP 2

 

위의 코드를 다시 살펴보면 앞선 STEP 1의 답이 아닌, 또 다시 param과 param2를 언급하는 코드가 나온다. 

if prm1 == "pooost" and prm2 == "requeeest":

이 내용 그대로 키워드를 입력해 보면, 

플래그를 알려 준다. 이 내용 그대로 드림핵 문제 페이지에 입력하면 해결 완료

'SWUFORCE > 워게임 풀이' 카테고리의 다른 글

[Dreamhack] php7cmp4re (web)  (0) 2024.05.07
[Dreamhack] Carve Party (web)  (0) 2024.05.01
[Dreamhack] Flying Chars  (0) 2024.04.02
[Dreamhack] ex-reg-ex(web)  (0) 2024.04.02
[Dreamhack] file-download-1(web)  (0) 2024.03.26

https://www.ahnlab.com/ko/contents/content-center/35578

 

AhnLab | 콘텐츠 센터

 

www.ahnlab.com


Notepad++의 기본 Plugin인 "mimeTools.dll"가 변조돼 악성코드가 유포된 정황이 확인되었다. 

특정 버전의 Notepad++ 패키지 설치 파일에 포함되어 정상 패키지 파일로 위장한 악성코드는 사용자가 Notepad++를 실행하기만 해도 설치된다. 

 

mimeTools

  • 베이스64(base64)등의 인코딩 기능 수행하는 모듈
  • notepad++을 실행시키면 자동으로 로드됨.
    • 공격자가 이 점을 악용. 
    • 일종의 DLL 하이재킹(Hijacking) 기법 사용한 것으로 확인

 

악성코드 유포 방법

  1. 공격자는 mimeTools.dll에 암호화된 악성 셸코드&복호화 및 실행 코드를 추가. 
    • certificate.pem 파일에 악성 셸 코드가 포함되어 있음
  2. 악성 패키지에도 기존의 mimeTools.dll에서 제공하는 기능들은 그대로 구현되어 있음

 

 

악성코드 실행 흐름

  1. Indirect Syscall
    • 실행 시점에서 안티바이러스 제품 우회를 위해 indirect syscall 기법을 사용
    • jmp문을 이용해 syscall로 분기
      • 해당 syscall 호출하기 위해 필요한 인자 값을 직접 세팅
      • ntdll을 후킹해 Natice API 모니터링하는 안티바이러스 제품을 우회
    • 복호화된 셸 코드는 최초 실행된 notepad++ 프로세스 영역에 생성됨
    • certificate.pem 파일(악성코드를 포함한 파일)의 바이너리는 Crypt32.dll, BCrypt.dll 모듈을 사용해 셸코드로 바뀜
    • 이후 셸코드 생성된 영역에 실행 권한 부여, jmp문을 통해 실행 흐름이 전환됨
  2. BingMaps.dll 변조
    • BingMaps.dll의 EntryPoint를 변조하고 Export 함수인 GetBingMapsFactory()의 내부 코드를 셸코드로 덮어 씌움
    • BingMaps.dll->GetBingMapsFactory()로 실행 흐름이 전환됨
      • 1. NtCreateThreadEx()
        2. NtGetContextThread()
        3. NtSetContextThread() : Set RIP
        4. ResumeThread()
    • 스레드 생성 이후 NtGetContextThread() 이용해 해당 스레드의 레지스터 값 가져옴
    • RIP 레지스터를 GetBingMapsFactory로 세팅 
  3. 변조된 GetBingMapsFactory()
    • 이전 과정(2번 과정)에서 셸코드로 덮어씌워짐
    • VM 등의 분석 환경 인식해 프로세스 종료하는 과정이 존재, explorer.exe에 스레드를 삽입
    • 런타임에 실행 중인 모든 프로세스 이름을 대상으로 한 글자씩 Shift, XOR 연산해 해시값 생성
      • 생성된 해시값은 특정 프로세스의 존재 여부 확인에 사용됨
      • 해시 일치할 경우 추가 악성 행위 하지않고 종료
    • explorer.exe 프로세스 만나면 이후 악성 행위에 필요한 정보 (PID) 추가로 수집해 보관
  4. Explorer.exe (Injected)
    • 여기서부터 본격 악성 행위 시작.
    • 공격자는 C2에 접속해 추가 셸코드 다운로드 및 실행
    • C2와 통신하는 과정에서 사용되는 문자열->특정한 함수->URL
      • C2 URL 문자열은 홀수 번째의 문자만 이어붙여 획득 가능
    • 사용자 PC에서 수집한 정보들이 베이스64로 인코딩돼 공격자에게 전달됨
    • C2 통신 이후 response에서 특정한 문자열의 offset 찾음
      • 해당 offset에서 추가 셸코드 복호화해 해당 셸코드로 jmp
    • 해당 C2는 분석 시점에 워드프레스 로그인 파일로 확인됐고 최초 유포 당시엔 외형이 Wiki 사이트로 확인돼 "위키로더(Wiki Loader)"라는 이름 붙음

▼ 아래의 강의를 활용해 학습 및 정리하였습니다. ▼

https://inf.run/zmPL

 

인프런 - 라이프타임 커리어 플랫폼

프로그래밍, 인공지능, 데이터, 마케팅, 디자인, 엑셀 실무 등 입문부터 실전까지 업계 최고 선배들에게 배울 수 있는 곳. 우리는 성장 기회의 평등을 추구합니다.

www.inflearn.com


1. 도구 설치, 환경 설정, 문제 다운로드

메모리 포렌식

  • 메모리
    • 프로그램이 올라갈 수 있는 공간에 올라가 있는 곳
    • 메모리 뒤져 보면 프로그램 정보, DLL정보, 파일 정보, PW 등 발견 가능

Volatility

  • 위에서 말한 걸 할 수 있는 도구.

시스템 환경 변수

  • 어떤 경로에서도 접근할 수 있도록.
  • 설정 방법: 윈도우>시스템 환경 변수 편집>환경 변수>시스템변수>패스값 편집>볼라틸리티 폴더 경로를 복붙
    • 이제 터미널에서 바로 volatility 접근 가능.

문제 다운로드

  • volatility wiki
  • ctfd.com

윈도우즈 터미널 사용법 - https://velog.io/@hunjison/Windows-Terminal-%EA%B8%B0%EC%B4%88-%EC%82%AC%EC%9A%A9%EB%B2%95

 

Windows Terminal 사용법

Windows Terminal이 새롭게(?) 나왔다.Linux나 MacOS에 비해 Windows는 터미널이 구리다는 점이 항상 아쉬웠는데 참 좋은 소식이다.그럼에도 Linux 터미널에 익숙해진 나에게 Windows Terminal은 2% 부족한 느낌이

velog.io


2&3. Volatility Cridex 풀이

  • vloatility -f <이미지>imageinfo
    • 메모리 덤프를 보고, 어떤 운영체제의 메모리 덤프인지 판단.
    • 어떤 운영체제인지에 대한 값이 앞으로 모든 분석에서 사용.
  • pslist
    • 프로세스 리스트 출력(시간 순서대로)
  • psscan
    • offset(메모리 덤프 파일이 어느 위치에 존재하는지. 주소?) 순서대로 출력
  • pstree
    • 모양이 구조화돼서 보여짐
    • PID, PPID는 부모자식관계
  • psxview
    • pslist와 psscan 포함하여 총 7가지 도구 결합된 도구
    • 다 쓰진 않고 pslist와 psscan 한눈에 보는 도구.

 

adobe -> PDF파일 리더 -> 악성 코드 많음

 

프로세스 말고 커맨드라인 보기

  • cmdscan > cmdscan.log
  • consoles > consoles.log
  • cmdline > cmdline.log
    • 프로세스가 실행될 때 인자값

해서 저장하고 노트패드로 전부 열어줌. cmd라인이 쭉 나옴

 

  • filescan 
    • 메모리 내에 존재하는 모든 파일에 대한 정보
  • connections
    • 연결된 TCP 통신에 대한 정보 출력
  • memdump  
    • 메모리 덤프 중에서도 프로세스의 메모리 부분을 덤프해서 가져옴.
  • dumpfiles
  • procdump
    • 이걸로 뽑아낸 exe는 실제로 실행됐던 exe

sysinternalsuite를 시스템 환경 변수 등록해 주기. 

스트링즈 나온 상태에서 스트링즈 덤프 아래에 log파일 출력(리디렉션 해서)

 

의심되는 ip 주소를 찾아 보니 해커의 주소로 추정되는 주소들 다량 발견

  • reader_sl.exe가 악성 pdf 문서를 읽어서 취약점으로 인해 해당 url들로 접속을 한 시나리오?
  • 은행 관련 단어가 많이 나옴 -> 은행과 유사한 가짜 사이트 만든 것?

 

filescan.log에서 reader_sl.exe을 터미널로 검색해 보니 악성코드 발견!

 

4&5. CTF-d, GrrCon 2015 풀이

 


문제풀이

Q. 프로세스 리스트를 시간 순서대로 출력할 수 있는 명령어는?

A.  pslist

 

Q. outlook 소프트웨어가 의심되는 소프트웨어인 이유가 무엇인가?

A. 메일 관련 소프트웨어임. 메일을 통해 악성 코드가 많이 오가기 때문. 

 

Q. 현재 연결된 TCP 통신 정보를 보여주는 명령어는?

A. connections

'SWUFORCE > 디지털 포렌식' 카테고리의 다른 글

디지털 포렌식_06  (0) 2024.07.03
디지털 포렌식_05  (0) 2024.05.21
디지털 포렌식_04  (0) 2024.05.15
디지털 포렌식_03  (0) 2024.05.07
디지털 포렌식_01  (1) 2024.03.26

문제 설명


익숙하게 웹해킹 문제 링크에 접속했는데,

음...

정말당황...

 

F12를 눌러 소스를 확인해 봤다

이렇게 총 20개의 png 파일이 보인다.

각각 눌러서 들어가 보면, 각 사진이 문자 또는 기호들이다. 

이 사진들이 날아다니고 있는 것으로 보인다.

 

각 사진 속의 문자를 나열해 보면

png 내용
o.png _
1.png x.x
2.png t
3.png h3
4.png h4
5.png sE
6.png _
7.png _H
8.png rd
9.png o_
10.png T
11.png e
12.png t
13.png o
14.png _
15.png r
16.png 4
17.png o
18.png S_
19.png C

아무래도 이 모든 문자를 나열하는 게 플래그일 것 같진 않다.

이쯤에서 html 코드도 확인해 본다. 

 

<html>
<head>
  <title>Web</title>
</head>
<body>
  <div id="box">
  </div>

  <style type="text/css">
    body{
      display: flex;
      width: 100vw;
      height:100vh;
      padding: 0px;

    }
    #box{
      display: flex;
      flex-direction: column;
      justify-content: space-around;
      width: 90%;
      height:100%;
    }
  </style>

  <script type="text/javascript">
    const img_files = ["/static/images/10.png", "/static/images/17.png", "/static/images/13.png", "/static/images/7.png","/static/images/16.png", "/static/images/8.png", "/static/images/14.png", "/static/images/2.png", "/static/images/9.png", "/static/images/5.png", "/static/images/11.png", "/static/images/6.png", "/static/images/12.png", "/static/images/3.png", "/static/images/0.png", "/static/images/19.png", "/static/images/4.png", "/static/images/15.png", "/static/images/18.png", "/static/images/1.png"];
    var imgs = [];
    for (var i = 0; i < img_files.length; i++){
      imgs[i] = document.createElement('img');
      imgs[i].src = img_files[i]; 
      imgs[i].style.display = 'block';
      imgs[i].style.width = '10px';
      imgs[i].style.height = '10px';
      document.getElementById('box').appendChild(imgs[i]);
    }

    const max_pos = self.innerWidth;
    function anim(elem, pos, dis){
      function move() {
        pos += dis;
        if (pos > max_pos) {
          pos = 0;
        }
        elem.style.transform = `translateX(${pos}px)`;
        requestAnimationFrame(move);
      }
      move();
    }

    for(var i = 0; i < 20; i++){
      anim(imgs[i], 0, Math.random()*60+20);
    }
  </script>
</body>
</html>

이 코드에서 27번째 줄만 수상할 정도로 길다.

 

    const img_files = ["/static/images/10.png", "/static/images/17.png", "/static/images/13.png",
    "/static/images/7.png","/static/images/16.png", "/static/images/8.png", "/static/images/14.png",
    "/static/images/2.png", "/static/images/9.png", "/static/images/5.png", "/static/images/11.png",
    "/static/images/6.png", "/static/images/12.png", "/static/images/3.png", "/static/images/0.png",
    "/static/images/19.png", "/static/images/4.png", "/static/images/15.png", "/static/images/18.png",
    "/static/images/1.png"];

그것만 따로 빼 와서 보니

다음과 같다.

 

아니나 다를까...

이미지 파일들을 원래 순서와 달리 섞어둔 게 보인다

이대로 문자를 나열해 보자

Too_H4rd_to_sEe_th3_Ch4rs_x.x

 

대박...

그렇다면,

Flag = DH{Too_H4rd_to_sEe_th3_Ch4rs_x.x}

이다!

 

구글링 하나도 없이 문제 혼자 푼 거 처음이당

끝~

'SWUFORCE > 워게임 풀이' 카테고리의 다른 글

[Dreamhack] Carve Party (web)  (0) 2024.05.01
[Dreamhack] simple-web-request (web)  (0) 2024.05.01
[Dreamhack] ex-reg-ex(web)  (0) 2024.04.02
[Dreamhack] file-download-1(web)  (0) 2024.03.26
[Dreamhack] cookie(web)  (1) 2024.03.26

문제 설명


 

웹해킹 링크에 접속하니 문자열을 입력받을 수 있는 페이지가 나온다.

올바른 input이 들어가면 Flag값이 아래에 뜨는 형식인 것 같다.

 

문제 파일을 다운로드해 열어 보니 아래와 같은 파이썬 코드가 나온다. 

솔직히 넘 어려웠어요.........

 

또 구글링의 힘을 빌린 결과

 m = re.match(r'dr\w{5,7}e\d+am@[a-z]{3,7}\.\w+', input_val)

이 부분이 문제의 핵심이라고 한다. 

문제에도 플래그는 flag.txt 파일과 FLAG 변수에 있다고 했으니 

위 코드의 정규 표현식과 매치된 입력값 문자열 객체가 참이면 flag 변수에 플래그가 저장되는 것이라는.......

 

이제 코드의 정규 표현색을 해석해야 한다.

정규 표현식 해석
dr 문자열 'dr'
\w{5,7} 5개에서 7개 문자
e 문자 'e'
\d+ 숫자 1개 이상
am@ 문자열 'am@'
[a-z]{3,7} 3개에서 7개의 소문자 알파벳
\. 문자 '.'
\w+ 문자 하나 이상

지정된 문자열이나 문자가 아니라면 개수로 지정된 문자 또는 숫자는 임의로 아무거나 집어 넣어도 되는 것 같다.

임의로 집어넣을 수 있는 공간에

알파벳은 전부 j, 숫자는 전부 7로 채운다고 치고 입력값을 정해 보았다

 

drjjjjje7am@jjj.j

 

내가 마음대로 정한 입력값이다

이대로 imput값으로 입력해 보니,

이렇게 Flag 값이 나왔다!!

 

Flag: DH{e64a267ab73ae3cea7ff1255b5f08f3e5761defbfa6b99f71cbda74b7a717db3}

 

끝~

'SWUFORCE > 워게임 풀이' 카테고리의 다른 글

[Dreamhack] simple-web-request (web)  (0) 2024.05.01
[Dreamhack] Flying Chars  (0) 2024.04.02
[Dreamhack] file-download-1(web)  (0) 2024.03.26
[Dreamhack] cookie(web)  (1) 2024.03.26
[Dreamhack] 64se64 문제 풀이  (0) 2024.03.19

https://www.samsungsds.com/kr/insights/generative-ai-for-customer-experience.html

 

고객 경험을 강화하는 생성형 AI 활용 사례 | 인사이트리포트 | 삼성SDS

고객 경험은 생성형 AI의 강력한 영향력 아래에 있습니다. 생성형 AI는 방대한 데이터를 기반으로 고객과 소통하고 문제를 더 빠르게 해결하는 과정에 사용되고 있습니다. 고객센터에 생성형 AI

www.samsungsds.com

 


생성형 AI

  • 방대한 데이터를 기반으로 고객과 소통하고 문제를 더 빠르게 해결하는 과정에 사용되고 있음

 

고객 경험(Customer Experience, CX) 역시 생성형 AI의 강력한 영향력 아래에 있음
  • 서비스 전문가들의 2/3 이상은 생성형 AI가 고객에게 더 나은 서비스를 제공하는 데 도움이 될 것이라고 주장.
  • 고객센터+생성형 AI의 시도가 늘어나는 추세
  • 기업이 고객 서비스 상담원의 역량 강화를 위해 AI 지원 도구(자연어로 질문하고 실시간으로 고객의 질문에 대한 답변을 받는 등)의 사용을 늘릴 것


생성형 AI가 마치 모든 걸 해결해 줄 것처럼 생각하지만, 사실은 아님
제대로 된 CX를 위해서는 다양한 기술 중 적절한 기술을 찾아야 함

  • ‘조직 내 문제가 무엇이고 그 문제를 해결하는 데 적합한 도구는 무엇인가‘

 

고객 서비스 개선을 위해 선제적으로 생성형 AI를 도입/검토한 기업

 

펩시코(PepsiCo)

식음료 대기업

  • 고객과의 소통 위해 '도리토스 사일런트' 개발
    • 영국 게이머 중 거의 절반이 무엇인가 먹는 소리가 헤드폰에 들리는 걸 싫어한다고 분석
    • 특히 과자 먹는 소리를 거슬려함, 그런데 펩시코의 과자 '도리토스'는 바삭거리는 소리가 심함
    • 게이머의 만족도를 높이기 위해 '바삭거리는 소리를 분석하는 AI 시스템인 도리토스 사일런트'라는 것을 개발
    • 6개월동안 5,000개의 바삭거리는 소리를 분석해 과자 먹는 소리만 없애는 기능을 만들고 앱으로 구현. 

 

TSB뱅크

영국 금융기업

  • 데이터 중심 전략 구축을 위해 어도비 기술 중 AP 액티비티(Automated Personalization Activity)&생성형 AI 모델인 파이어플라이 활용
  • 맞춤 은행 경험 제공
  • 머니 컨피던스 허브(Money Confidence Hub)
    • 온라인뱅킹의 초개인화 서비스 위해 각종 데이터 추적

 

심플리헬스

영국의 의료서비스 예약 및 보험금 청구 서비스 제공업체

  • 세일즈포스의 생성형 AI 서비스인 '아인슈타인 포 서비스' 활용, 대화형 AI 구축해 상담원 업무 효율 높임
  • 자주 묻는 질문들을 처리할 때 생성형 AI 답변을 주로 활용
    • GPT 기반 기술로 전체 프로세스의 속도 빨라짐 (평균 12분 이메일 응대->1분 30초)
    • 고객 불만의 84%가 3일 안에 해결

 

엑스페레오

네트워크 기술 업체

  • 세일즈포스의 서비스 GPT와 아인슈타인 기술을 검토 중
  • 세일즈포스의 클라우드 플랫폼을 활용해 데이터를 축적
  • 엑스페레오원
    • 네트워크 성능 분석
  • GPT 기반 지식은 쿼리에 대한 빠른 응답 제공에 사용
  • 서비스 전 영역에 걸쳐 고객에게 보다 심층적 정보 제공

AI가 CX 분야에 강력하고 장기적인 영향을 미칠 수 있으나,

AI를 CX 과제의 만병통치약으로 여겨선 안 된다.

- (영국의 헤드헌팅기업 내쉬 스퀘어드의 CEO, 베브 화이트)

 

고객 경험을 제대로 개선하기 위해선 고객 요구사항의 복잡성 이해해야 함.

모든 일의 중심에는 항상 사람의 전문성이 중요!

문제 설명


 

웹해킹 문제 링크 들어가면 아래와 같이 나온다.

 

 

내 메모를 업로드하라길래 Upload My memo 들어가 보니

Filename과 Content 입력한 뒤 업로드가 가능한 창이 뜬다. 

 

파이썬 쉘(IDLE)에서 ctrl+O 해서 문제 파일인 app.py를 열어 보니 이런 소스코드가 나왔다. 

 

 

사실 이쯤에서 역대급으로 막막했다...

이것저것 구글링을 해 보니 일단 임의로 아무 파일이나 업로드해야 하는 것 같아서 해 보았다. 

업로드 버튼을 클릭하면

이렇게 내가 업로드한 파일을 확인할 수 있다. 

클릭해서 들어가면 내가 입력한 Content의 내용도 보인다. 


이 아래부터는 전적으로 다른 사람들의 풀이에 의존한 내용이다.

 

문제 코드를 다시 확인해 보면, 

이렇게 upload 부분에서는 

        if filename.find('..') != -1:
            return render_template('upload_result.html', data='bad characters,,')

find 명령어를 이용해 상위 디렉토리 이동 명령어인 '..'을 탐지한다. 

'..'이 탐지되면 'bad characters,,'을 출력한다. 어쨌든 ..을 포함한 파일을 업로드하지 말라는 거인 듯.

 

새로운 파일의 이름을 ../flag.py로 하여 업로드 했더니 역시나 'bad characters,,' 라고 뜬다.

 

 

그러나 read 부분에서는 '..'을 탐지하지 않는다. 

 

read가 도대체 어디에 있는 거지... 싶어서 막막했는데 문제 URL을 보니까

찾았다

 

저 URL 뒷부분을 

read?name=../flag.py로 수정했더니

찾았다

 

끝!

지금까지 푼 것 중엔 제일 어려웠던 것 같다

'SWUFORCE > 워게임 풀이' 카테고리의 다른 글

[Dreamhack] Flying Chars  (0) 2024.04.02
[Dreamhack] ex-reg-ex(web)  (0) 2024.04.02
[Dreamhack] cookie(web)  (1) 2024.03.26
[Dreamhack] 64se64 문제 풀이  (0) 2024.03.19
[Dreamhack] baby-linux 문제 풀이  (0) 2024.03.19

+ Recent posts