1. 제어판

2. 접근성 센터

3. 보다 쉽게 작업에 집중할 수 있도록 설정

4. 화면 가장자리로 이동할 때 창이 자동으로 배열되지 않도록 방지 체크 해제


레지스트리 건드려보고,, 키보드 판매처 검색해보고,, Fn키 눌러도보고 막해봤는데...

드디어 찾았네요.. 피시방 올 때 마다 윈도우 키 + 방향키가 안먹혀서 너무 불편했는데...!!


이제. 코딩 편하게 해야지.



#Solution


"C:\Windows\System32\spool\PRINTERS" 여기서 SPL 파일 바탕화면이나 아무데나 복사하거나 가져오고, 

인터넷에서 SPL Viewer 다운로드 받고 출력하세요. 복사방지마크이 지원 프린터 이런거 필요도 없으니 휴...


SPL 파일이 안보이면 윈도우 탐색창에서 "보기 > 옵션 > 폴더 및 검색 옵션 변경 > 보기 > 알려진 파일 형식의 파일 확장명 숨기기"에서 체크 해제 하세요.


계속해서 증명서 뽑아야할 경우 유료일 경우도 있는데 여기 파일 하나 뽑아두면 계속해서 출력가능합니다. 


적고나니 너무 간단해서 할말이 없긴한데 해결하기 전까지 수 많은 수모와 고통을 겪었던거 생각하니 부들부들...


그래도 덕분에 말로만 듣던 spool 공부했네요. EMF 형식에 헤더 시그니처는 "00 00 10 00" .. 머 이정도... 글고 앞으로 학위 증명서 같은거 뗄 때 무료로 출력 가능하겠네요. 


#에러

파이썬 코드 작성에 있어, Immunity Debugger를 사용하기 위한 immlib 모듈 import에 있어 에러 뜰 때



#해결법



#About


[시나리오]


A사에 근무하고 있는 박보안 부장은 PM으로 협력사인 B사와 함께 프로젝트 "WHITEHGAT"을 진행하고 있다.

프로젝트를 진행하면서 자료 공유는 외부 클라우드 서비스, 관련 코드는 별도의 소스관리 솔루션, 진행 사항은 팀 채팅 솔루션을 이용해 공유하였다.


어느날 박보안 부장은 평소와 다름없이 업무를 진행하였는데, 갑자기 자신이 쓰던 PC의 모든 문서가 암호화되는 사건을 겪었다. 인터넷을 검색해본 결과, "랜섬웨어"라고 불리는 악성코드에 감염된 것으로 보였다.


감염되기 전의 상황을 되짚어보았지만 기존에 해오던 일상적인 업무 이외에 특별한 행위를 하지 않았다고 생각했다.

재부팅한 결과, 공격자는 400만원의 돈을 요구했다.


암호화된 파일에는 "WHITEHAT" 프로젝트의 주요 파일이 포함되어 있어 400만원을 지불하고서라도 복구하고 싶었지만 공격자를 믿을 수는 없었다.


주어진 파일은 박부장의 PC HDD 이미지와 현장에서 획득한 메모리 덤프 파일이다. 어떻게 감염이 되었는지? 복호화는 불가능한 것인지? 분석하라!!


1. 박부장의 PC의 문서를 암호화한 랜섬웨어 파일은 무엇인가요? (전체 경로)

2. 박부장 PC에서 랜섬웨어에 의해 암호화된 파일을 모두 몇개인가요?

3. 랜섬웨어가 사용한 암호 알고리즘과 모드는 무엇인가요? (암호 알고리즘_모드)

4. 랜섬웨어 파일은 어디에서 다운로드 되었나요? (원본 파일 URL 전체 경로, 프로토콜 포함)

5. 랜섬웨어 파일을 다운로드한 다운로더(Downloader)는 무엇인가요? (파일명.확장자)

6. 다운로더(Downloader)는 박부장 PC에 언제 다운로드되었나요? (YYYY-MM-DDThh:mm:ss)


7. 다운로더(Downloader)는 어디에서 다운로드 되었나요? (다운로드 URL 전체 경로, 프로토콜 포함)

8. 박부장 PC의 문서를 암호화한 키가 저장되어 있는 데이터베이스명, 테이블명은 무엇인가요? (DBNAME_TABLENAME)

9. 박부장 PC의 문서를 암호화한 키는 무엇인가요?

10. 박부장 PC의 IP주소는 무엇인가요?



#Solution


[그림 1] - Arsenal Image Mounter


제공받은 이미지 파일을 마운트 시키기 위해, 마운트 전용 도구인 Arsenal Image Mounter를 사용했고, 생성 시간을 기준으로 첫 번째로 암호화 된 파일을 확인 해보았다.


[그림 2] - 첫 암호화 파일 확인


첫 번째로 암호화 된 파일은 PDFSigQFormalRep.pdf_enc로 암호화 파일 생성 시점은 "2015-09-25 15:22:48"이다


파일이 암호화 되었다는 것은, 이전에 암호화 작업을 진행하는 랜섬웨어 파일이 실행되었음을 의미하고, 첫 암호화 시점을 기준으로 이전을 보았을 때, 


의심스러운 temp.exe이라는파일을 확인할 수 있고 또한 생성된 bin, js파일의 경로를 확인 결과 웹 캐시 파일임을 알 수 있으며, 


이는 암호화 작업이 진행되기 전, 웹 사이트에 접속 했고 무언가를 다운받아서 실행했다는 가설을 세우고 분석을 진행할 수 있다


[그림 3] - 웹 브라우저 아티팩트 추출


세운 가설에 입각하여 웹 브라우저 아티팩트를 추출했고 아래와 같이 WEFA로 웹 히스토리를 확인할 수 있었다.


[그림 4] - 웹 히스토리 확인


방문 횟수를 기준으로 보았더니, tenos.jandi.com/app/이라는 URL에 가장 많이 방문함을 확인할 수 있고,


이는 검색 결과 아래와 같이, 업무 협업툴을 제공하는 도메인임을 알 수 있다


[그림 5] - JANDI 확인


또한 아래의 캐시 필드에서 최근 방문 시간을 기준으로 필터링한 결과, 


암호화가 일어난 시점(2015-09-25 15:22:48)과 30초도 남짓 안되는 시간에, jandi로 부터 참고지침.hwp를 다운받음을 확인할 수 있다.


[그림 6] - 참고지침.hwp 확인


다운받은 참고지침.hwp는 [그림 2]에서 확인할 수 있듯 링크파일이 생성됐고, 이는 파일을 열람했음을 의미하며 열람 시각은 2015-09-25 15:22:34임을 확인할 수 있다.


이후 정확한 분석을 위해 파일 시스템 주요 로그들을 아래와 같이 추출 해주었다.

[그림 7] - 파일 시스템 로그 추출


추출한 파일 시스템 로그를 NTFS Log Tracker를 이용하여 아래와 같이 로그 정보를 파싱해주었다.


[그림 8] - 파일 시스템 로그 파싱


파싱 된 결과 중 참고지침.hwp가 생성된 2015-09-25 15:22:24 이후의 파일 시스템 로그를 확인하기 위해 아래와 같이 쿼리를 날려 주었다.


[그림 9] - 참고지침.hwp.lnk 생성


확인 결과, 참고지침.hwp.lnk이 생성 된 이후, "EMB00000d0c32d3.PCT" 파일과 "temp.exe"가 생성 되는 것을 알 수 있고 이 후 암호화 작업이 진행 된다.


참고지침.hwp를 확인하기 위해 참고지침.hwp.lnk 파일을 분석했고 결과는 아래와 같다.


[그림 10] - 참고지침.hwp.lnk 분석


결과 Users\KAB\AppData\Local\Micorosft\Windows\Temporary Internet Files\Content.IE5\L0Z3CKRQW 경로에 위치함을 알 수 있고 해당 경로를 따라가 


확인 해보았지만 파일이 삭제되어 확인할 수 없었다. 아마 랜섬웨어가 실행되면서 다운로더 역할을 한 참고지침.hwp를 삭제했음을 유추해볼 수 있다.


이는, 랜섬웨어 파일의 실행시각과 파일 시스템상에서의 참고지침.hwp가 삭제된 로그의 시간을 비교하면 확인가능하다


[그림 11] - PCT 파일 확인


참고지침.hwp.lnk가 생성되고 나서 바로 다음으로 생긴 EMB00000d0c32d3.PCT를 확인 결과, 


/wp-includes/theme-compat/post.gif라는 주소를 확인할 수 있으며 아래에는 temp.exe를 다운로드 한다는 것을 유추할 수 있다.


temp.exe를 복구하고 싶었으나, 데이터가 지워져서 더 이상 복구를 진행할 수 없었다.


여기까지를 정리하면, 박 부장은 한글 악성코드라 여겨지는 참고지침.hwp를 다운 및 실행하였고 이는, 


EMB00000d0c32d3.PCT를 생성하고 이 PCT 파일은 temp.exe라는 랜섬웨어 파일을 다운로드 및 실행한다


ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


















[그림 ~] - pstree 명령 결과


vmdk와 함께 메모리 덤프를 확인 결과, Hwp.exe는 2015-09-25 06:22:24에 실행 되었고, UTC+09:00을 감안했을 때, 참고지침.hwp를 실행시킨 시각과 일치한다. 


또한 Hwp.exe는 하위 프로세스로 temp.exe를 실행하며 이는 파일의 첫 암호화 시점인 2015-09-25 15:22:48과 10초도 채 차이 나지 않으며


temp.exe의 하위 프로세스로 cmd.exe가 실행되며 당시 실행되었던 명령을 확인하기 위해 아래와 같이 cmdline를 이용했다


[그림 ~] - cmdline 명령


확인 결과, cmd.exe에서 [그림 ~]의 하위 프로세스로 존재하던 OfficeHelp.exe 파일을 실행 시키는 것을 알 수 있다



[그림 ~] - OfficeHelp.exe 추출


OfficeHelp.exe의 행위를 분석하기 위해 추출하여 일차적으로 VirusTotal에 검증을 받은 뒤, 위와 같이 실행한 결과 


전형적인 파일 암호화 행위 후, 금전을 요구하는 메세지 박스를 띄우는 역할을 하는 것을 확인할 수 있다.


( * 정확한 행위 분석을 위해서는 정적분석이 필요 합니다.)









'Wargame' 카테고리의 다른 글

[LINUX] 2012 Secuwave F100  (0) 2018.09.15
[SCENARIO] CFReDS_ data leakage case  (0) 2018.07.19
2013 [Hack The Packet] M_01  (0) 2018.03.21
2013 [Hack The Packet] L_01  (0) 2018.03.21
2011 [Hack The Packet] L_03  (0) 2018.03.21

#About


이벤트 예약 웹사이트를 운영하고 있는 "깜짝이야"사의 관리자 앞으로 한통의 협박 메일이 도착했다. 당장 10억을 입금하지 않으면, 확보한 자사의 웹페이지 소스코드를 모두 공개할 것이며, 추가적인 위협을 가하겠다는 내용이다. 관리자는 포렌식 전문가인 당신에게 침해사고 분석을 의뢰하였다. 침해된 시스템에 남겨진 흔적과 각종 로그 파일을 분석하여 다음 사항을 밝혀내시오.


A. 공격자가 웹페이지 소스코드를 유출한 시간(UTC+09:00)은? (yyyy-MM-dd_hh:mm:ss)

B. 리버스 셸(Reverse Shell)을 동작시키는 프로세스 ID(PID)는 ? (10진수)

C. 리버스 셸(Reverse Shell)에 대한 공격자 주소(IP)는?


답 입력 : md5("yyyy-MM-dd_hh:mm:ss_PID_XXX.XXX.XXX.XXX")




#Solution


제공받은 파일을 확인해보면 아래와 같이 accounts, file, network, osinfo, process, weblog의 폴더가 존재함을 확인할 수 있다


[그림 1] - 문제 파일 확인


먼저, 아래와 같이 accounts 폴더를 확인하니 history 명령의 결과가 담겨있음을 확인할 수 있었고, 아래와 같이 확인해보았다


[그림 2] - history 확인


셸 history를 확인 결과, chmod 777라는 명령으로 /var/www/upload/editor/image의 경로에 모든 권한을 주는 것을 확인할 수 있고,


ahnlab이라는 계정을 생성 및 포렌식 분석 도구인 sleuthkit을 설치하는 것을 일차적으로 확인할 수 있다


확실한건 chmod 777 /var/www/upload/editor/image라는 명령으로 모든 권한을 주는 것은 일반적이지 않은 행위이며 이는 웹과 관련되었다는 것을 예상해볼 수 있다


[그림 3] - process 폴더 확인


다음으로, 휘발성이 강하며 많은 정보를 담고 있는 process폴더에 접근하여 파일을 확인해보았더니 아래와 같이 ps -eaf 의 명령의 결과가 저장되어 있었다


[그림 4] - ps_eaf 명령 확인


프로세스 정보의 출력 결과가 담긴 ps_eaf를 확인해보았더니 아래와 같다.


[그림 5] - ps_eaf 파일 확인


확인 결과 www-data라는 사용자가 셸을 sh -c을 통해 명령을 실행하고 있으며 셸의 명령을 통해 생성된 자식프로세스(PID=5248)가


php -f 명령을 통해 /var/www/upload/editor/image/reverse.php를 실행하고 있음을 확인할 수 있다.


이는 [그림 2]에서 chmod 777 /var/www/upload/editor/image의 디렉터리에 권한을 전부 주는 것과 연관 되어 있음을 예상할 수 있다.


다음으로 network 폴더에서 lsof의 결과가 저장되어 있음을 확인했다. lsof는 list open files로 시스템에 열려 있는 파일목록을 알려준다


[그림 6] - lsof 확인


cat lsof 명령을 내린 결과 수 많은 결과가 출력되어 grep으로 [그림 2]와 [그림 5]에서 의심스러운 디렉터리를 검색한 결과,


www-data라는 사용자가 apache2, sh, php 명령을 실행시켰고 이를 통해 파일이 열려 있는 상태임을 알 수 있다.


따라서 웹과 관련된 서비스가 열려 있는지 확인하기 위해 netstat_an 파일을 확인해보았더니 아래와 같은 결과를 확인할 수 있었다.


[그림 7] - netstat_an 확인


확인 결과, 192.168.184.162라는 로컬 호스트에서 해커의 IP로 추정되는 144.206.162.21이라는 원격지로 HTTP 연결이 되어 있음을 알 수 있었다.


이를 통해 이미 공격자는 리버스 셸을 통해 공격이 성공 했음을 추측할 수 있고, 리버스 셸과 관련된 행위를 찾기 위해 weblog를 확인 결과 아래와 같다.


[그림 8] - weblog 확인


웹 로그를 확인 결과, 112.220.97.29라는 IP에서 cmd.php의 cmd라는 파라미터를 인젝션 벡터로 하여금, base64로 추정되는 명령을 보냈고 응답코드 200을 통해 정상적으로 실행되었음을 알 수 있다


base64 디코딩 결과는 아래와 같다


cHdk

pwd


bHMgLWFsICAvdmFyL3d3dy91cGxvYWQvZWRpdG9yL2ltYWdlLw%20%20

ls -al  /var/www/upload/editor/image/ 


dGFyIC1jdmYgL3Zhci93d3cvdXBsb2FkL2VkaXRvci9pbWFnZS8xMzMwNjY0ODM4IC92YXIvd3d3Lw%20%20

tar -cvf /var/www/upload/editor/image/1330664838 /var/www/


cGhwIC1mIC92YXIvd3d3L3VwbG9hZC9lZGl0b3IvaW1hZ2UvcmV2ZXJzZS5waHA%20

▶ php -f /var/www/upload/editor/image/reverse.php


1. 이를 통해 가볍게 해커는 pwd 명령을 통해 cmd라는 파라미터을 인젝션 벡터로써 가능한지 확인하고,


2. tar -cvf /var/www/upload/editor/image/1330664838 /var/www/ 명령을 통해 관리자의 웹 페이지 소스코드를 압축한 뒤,


3. GET 메소드를 통해 압축 된 소스코드를 다운받고


4. php -f /var/www/upload/editor/image/reverse.php 명령을 통해 리버스 셸을 실행시켜 압축한 소스코드를 탈취 해갔음을 알 수 있다.


A : 2012-08-25_17:23:02

B : 5248

C : 144.206.162.21




'Wargame' 카테고리의 다른 글

[SCENARIO] 2015 WHITE HAT CONTEST 예선  (0) 2018.09.16
[SCENARIO] CFReDS_ data leakage case  (0) 2018.07.19
2013 [Hack The Packet] M_01  (0) 2018.03.21
2013 [Hack The Packet] L_01  (0) 2018.03.21
2011 [Hack The Packet] L_03  (0) 2018.03.21

# -*- coding:utf-8 -*-
from bs4 import *
from selenium import webdriver
import xlsxwriter as xlsx
import time

'''
Author : Crody
Date : 2018-07-27 04:06 (UTC + 09:00)
Nationality : Republic of Korea
Purpose : Automative Give
'''

# 엑셀 파일 생성
wb=xlsx.Workbook("C:/result.xlsx")
ws=wb.add_worksheet()

# 엑셀 셀 속성 설정
format0=wb.add_format({'border':2,'bold':True,'align':'center','fg_color':'white','font_color':'black'})
format1=wb.add_format({'border':1,'bold':True,'align':'center','fg_color':'white','font_color':'black'})

# 엑셀 셀 너비 설정
ws.set_column('A:A',10)
ws.set_column('B:B',100)
ws.set_column('C:C',10)

# (x+1,y+1)의 위치에 데이터 입력 및 셀 속성 설정
ws.write(0,0,u'번호',format0)
ws.write(0,1,u'제목',format0)
ws.write(0,2,u'금액',format0)

# 엑셀 행을 바꾸기 위한 변수 init 할당
global init
init = 1

def write(count):
ws.write(init,0,count-1,format1)
ws.write(init,1,name[count-2],format1)
ws.write(init,2,don[count-2],format1)

# 기부 컨텐츠 제목 및 기부 금액을 담을 리스트 할당
name = list()
don = list()

# 기부 컨텐츠 제목 및 기부 금액 추출
def extract_title_and_money():
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
for title in soup.find('title'):
name.append(title)
print u"[+] 기부 완료 : {}".format(title)
item = soup.find('dl', {'class': 'detail_fund fund_belong'})

for person in item.find('dt', {'class': 'tit_fund'}):
for total in item.find('dd', {'class': 'txt_fund'}):
persons = int(person[person.find('(') + 1:person.find(')') - 1].replace(',','')) # 응원기부 (xxx명)
totals = int(total.replace(u'원', '').replace(',', '')) # xx,xxx원
don.append(totals/persons)
print u"\t[-] 기부 금액은 {}원 입니다".format(totals/persons)

# 크롬 웹 드라이버를 이용한 다함께 카카오 페이지 오픈
driver = webdriver.Chrome('C:/chromedriver')
driver.implicitly_wait(1)
driver.get("https://together.kakao.com/fundraisings/now")

# 다함께 카카오 로그인 기능
driver.find_element_by_xpath('//*[@id="dkHead"]/div[1]/div[2]/a[2]').click()
driver.find_element_by_xpath('//*[@id="loginEmail"]').send_keys('Your Email')
driver.find_element_by_xpath('//*[@id="loginPw"]').send_keys('Your Password')
driver.find_element_by_xpath('//*[@id="login-form"]/fieldset/button').click()

# 한 번에 볼 수 있는 게시물이 20개 이므로, 전체 게시물 보기 클릭.
for i in range(7):
driver.find_element_by_xpath('//*[@id="mArticle"]/div[3]/div[3]/button').click()

# 실제 기부 과정을 작동시키는 중심 코드
for loop in range(2,135):
try :
driver.find_element_by_xpath('//*[@id="mArticle"]/div[3]/div[2]/ul/li['+str(loop)+']/fundraising-card/a').click()
driver.find_element_by_xpath('//*[@id="txtCmt"]').send_keys(u'응원할게요')
driver.find_element_by_xpath('//*[@id="mArticle"]/comments/div/div[1]/div/div[2]/div/fieldset/button[2]').click()
extract_title_and_money()
write(loop)
init+=1
driver.back()
try:
driver.find_element_by_xpath('//*[@id="toast-container"]/div[2]/div/div[2]/div').click()
except:
pass
except Exception as e:
print (e)
pass
wb.close()

print "[+] 총 기부 횟수 = {}회".format(len(name))
print "[+] 총 기부 금액 = {}원".format(sum(don))

temporary post


#About


1. 와이어샤크에서의 Layer 4까지의 필드 정보 파싱




import socket
import dpkt

path = "C:/test.pcap"

def display():
print "\t[-] TYPE : {}".format(protocol)
print "\t[-] MAC : {} ---> {}".format(smac, dmac)
print "\t[-] LEN : {}".format(int(total_len, 16))
print "\t[-] TTL : {}".format(int(ttl, 16))
print "\t[-] IP : {} ---> {}".format(sip, dip)
print "\t[-] PORT : {} ---> {}".format(int(sport, 16), int(dport, 16))

with open(path,'rb') as p:
magic = p.read(4).encode('hex')
flag = (False, True)[magic == "d4c3b2a1"]
p.seek(36,1)
dmac = p.read(6).encode('hex')
smac = p.read(6).encode('hex')
type = p.read(2).encode('hex')
type = ("IPv6","IPv4")[type=="0800"]


if flag==True:
print "[+] Start parsing : {}".format(path)

if type=="IPv4":
p.seek(2,1) ; total_len = p.read(2).encode('hex')
p.seek(4,1) ; ttl = p.read(1).encode('hex')
protocol = p.read(1).encode('hex')
protocol = ("","TCP")[protocol=="06"]

p.seek(2,1)
sip = p.read(4).encode('hex')
dip = p.read(4).encode('hex')
sport = p.read(2).encode('hex')
dport = p.read(2).encode('hex')

ip_divide = range(0, 8, 2) ; mac_divide = range(0,12,2)
sip = '.'.join([str(int(sip[a:a+2],16)) for a in ip_divide])
dip = '.'.join([str(int(dip[b:b+2],16)) for b in ip_divide])
smac = ':'.join([str((smac[c:c+2])) for c in mac_divide]).upper()
dmac = ':'.join([str((dmac[d:d+2])) for d in mac_divide]).upper()

display()

elif type=="IPv6":
print("\t[-] It is IPv6 Packet")

elif flag==False:
print "[-] {} is not pcap file".format(path)

[코드 1] - test



[그림 1] - result


#To Do


1. 하나의 패킷이 아닌 모든 패킷 파싱을 위한 루프와 로직 만들기

2. 인터페이스 스니핑




+ Recent posts