이 영역을 누르면 첫 페이지로 이동
포렌식 & 개발 이야기 - Forensics & Development 블로그의 첫 페이지로 이동

포렌식 & 개발 이야기 - Forensics & Development

페이지 맨 위로 올라가기

Zone Identifier - Export Tool

포렌식 & 개발 이야기 - Forensics & Development

Zone Identifier - Export Tool

  • 2021.05.28 20:56
  • Forensics
글 작성자: pental

인터넷에서 다운로드 받은 파일이 악성코드일 가능성은 언제나 있다.

그래서 브라우저는 파일을 다운로드 받을 때 NTFS의 ADS 영역에 이 파일을 어디서 다운로드 받았는지에 관한 정보를 저장한다.

이 정보의 이름을 Zone.Identifier 라고 하며, 이 정보는 보안 프로그램에 의해 사용된다.


 

각 파일의 Zone.Identifier 값으로 다운로드 여부를 판단하며 ZoneId 값이 3이면 인터넷으로 부터 다운로드 된 파일이라고 볼수 있다. Zone.Identifier 은 ADS 의 일종으로 아래와 값은 값들을 가진다.

Zone.Identifier
ZoneId=1 Local Intra Net (로컬 인트라넷)
ZoneId=2 Urlzone_Trusted (신뢰 할 수 있는 사이트)
ZoneId=3 Internet (인터넷)
ZoneId=4 Urlzone_Untrusted (제한된 사이트)

예를 들어서 파일을 하나 다운 받고 커맨드 창에 다음과 같이 입력한다.

more < [File Name]:Zone.Identifier

파일명 뒤에 ":Zone.Identifier" 라는 문자열을 붙여 입력하면, 다음과 같이 해당 파일을 어디서 다운로드 받았는지에 관한 정보가 표시되는 것을 확인할 수 있다.


도구 제작

import os
import csv
import subprocess
from pathlib import Path
import pandas as pd
downloads_path = str(Path.home() / "Downloads")
print(downloads_path)
file_list = os.listdir(downloads_path)
temp = []
for i in range(len(file_list)) :
query = "more < " + downloads_path + "\\\"" + file_list[i] + "\":Zone.Identifier"
sysMsg = subprocess.getstatusoutput(query)
temp.append([file_list[i], sysMsg[1]])
result = []
for i in range(len(temp)) :
try :
test = temp[i][1].split("\n")[2] # try
name = temp[i][0]
ReferrerUrl = (temp[i][1].split("\n")[2][12:])
HostUrl = (temp[i][1].split("\n")[3][8:])
result.append([name, ReferrerUrl, HostUrl])
except :
pass
print(result)
f = open('output.csv', 'w', encoding='utf-8-sig', newline='')
wr = csv.writer(f)
wr.writerow(["File Name","ReferrerUrl","HostUrl"])
for i in range(len(result)) :
wr.writerow([result[i][0], result[i][1], result[i][2]])
f.close()
r_csv = pd.read_csv("output.csv")
save_xlsx = pd.ExcelWriter("Result.xlsx")
r_csv.to_excel(save_xlsx, index = False)
save_xlsx.save()
os.remove("output.csv")

GUI 개발

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5 import uic
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
import sys
import os
import csv
import subprocess
from pathlib import Path
import pandas as pd
ui_error_path = "main.ui"
ui_error = uic.loadUiType(ui_error_path)[0]
class MainWindow(QMainWindow, ui_error):
def __init__(self):
super().__init__()
self.setupUi(self)
# Button
self.file_button.clicked.connect(self.error_file_select)
self.csv_button.clicked.connect(self.csv)
self.parse_button.clicked.connect(self.parse)
self.excel_button.clicked.connect(self.excel)
self.exit_button.clicked.connect(self.exit_select)
# Path Select
def error_file_select(self) :
try:
global file_path
file_filter = 'All files (*.*)'
file_path = QFileDialog.getOpenFileNames(self, 'Select File', filter=file_filter)
file_path = file_path[0]
_translate = QCoreApplication.translate
self.tableWidget.setColumnCount(1)
self.tableWidget.setRowCount(len(file_path))
self.tableWidget.verticalHeader().setVisible(False)
for i in range(len(file_path)):
item = QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(i, item)
for i in range(1):
item = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(i, item)
item = QTableWidgetItem()
for i in range(len(file_path)):
for j in range(1):
self.tableWidget.setItem(i, j, item)
item = QTableWidgetItem()
for i in range(len(file_path)) :
item = self.tableWidget.verticalHeaderItem(i)
item.setText(_translate("MainWindow", str(i)))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "File"))
__sortingEnabled = self.tableWidget.isSortingEnabled()
self.tableWidget.setSortingEnabled(False)
self.tableWidget.setColumnWidth(0, 620)
for i in range(len(file_path)):
for j in range(1):
item = self.tableWidget.item(i, j)
item.setText(_translate("MainWindow", str(file_path[i])))
self.tableWidget.setSortingEnabled(__sortingEnabled)
table = self.tableWidget
header = table.horizontalHeader()
twidth = header.width()
width = []
for column in range(header.count()):
header.setSectionResizeMode(column, QHeaderView.ResizeToContents)
width.append(header.sectionSize(column))
wfactor = twidth / sum(width)
for column in range(header.count()):
header.setSectionResizeMode(column, QHeaderView.Interactive)
header.resizeSection(column, width[column]*wfactor)
except :
QMessageBox.information(self, "Error", "Error", QMessageBox.Ok, QMessageBox.Ok)
def parse(self) :
temp = []
for i in range(len(file_path)) :
query = "more < " + file_path[i] + ":Zone.Identifier"
sysMsg = subprocess.getstatusoutput(query)
temp.append([file_path[i], sysMsg[1]])
global result
result = []
for i in range(len(temp)) :
try :
test = temp[i][1].split("\n")[2] # try
name = temp[i][0]
ReferrerUrl = (temp[i][1].split("\n")[2][12:])
HostUrl = (temp[i][1].split("\n")[3][8:])
result.append([name, ReferrerUrl, HostUrl])
except :
pass
_translate = QCoreApplication.translate
self.zone_tableWidget.setColumnCount(3)
self.zone_tableWidget.setRowCount(len(result))
self.zone_tableWidget.verticalHeader().setVisible(False)
for i in range(len(result)):
item = QTableWidgetItem()
self.zone_tableWidget.setVerticalHeaderItem(i, item)
for i in range(3):
item = QTableWidgetItem()
self.zone_tableWidget.setHorizontalHeaderItem(i, item)
item = QTableWidgetItem()
for i in range(len(result)):
for j in range(3):
self.zone_tableWidget.setItem(i, j, item)
item = QTableWidgetItem()
for i in range(len(result)) :
item = self.zone_tableWidget.verticalHeaderItem(i)
item.setText(_translate("MainWindow", str(i)))
item = self.zone_tableWidget.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "File"))
item = self.zone_tableWidget.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "ReferrerUrl"))
item = self.zone_tableWidget.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "HostUrl"))
__sortingEnabled = self.zone_tableWidget.isSortingEnabled()
self.zone_tableWidget.setSortingEnabled(False)
for i in range(len(result)):
for j in range(3):
item = self.zone_tableWidget.item(i, j)
item.setText(_translate("MainWindow", str(result[i][j])))
self.zone_tableWidget.setSortingEnabled(__sortingEnabled)
table = self.zone_tableWidget
header = table.horizontalHeader()
twidth = header.width()
width = []
for column in range(header.count()):
header.setSectionResizeMode(column, QHeaderView.ResizeToContents)
width.append(header.sectionSize(column))
wfactor = twidth / sum(width)
for column in range(header.count()):
header.setSectionResizeMode(column, QHeaderView.Interactive)
header.resizeSection(column, width[column]*wfactor)
def csv(self) :
try :
f = open('output.csv', 'w', encoding='utf-8-sig', newline='')
wr = csv.writer(f)
wr.writerow(["File Name","ReferrerUrl","HostUrl"])
for i in range(len(result)) :
wr.writerow([result[i][0], result[i][1], result[i][2]])
f.close()
QMessageBox.information(self, "Success", "Export CSV Success", QMessageBox.Ok, QMessageBox.Ok)
except :
QMessageBox.information(self, "Fail", "Export CSV Fail", QMessageBox.Ok, QMessageBox.Ok)
def excel(self) :
r_csv = pd.read_csv("output.csv")
save_xlsx = pd.ExcelWriter("Result.xlsx")
r_csv.to_excel(save_xlsx, index = False)
save_xlsx.save()
os.remove("output.csv")
QMessageBox.information(self, "Success", "Export Excel Success", QMessageBox.Ok, QMessageBox.Ok)
def exit_select(self) :
self.close()
# Main Function
def main():
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
if __name__ == "__main__":
main()

Referrence 

https://kr.bandisoft.com/bandizip/help/zone-identifier/

https://en.wikipedia.org/wiki/NTFS#Alternate_data_streams_(ADS) 

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/6e3f7352-d11c-4d76-8c39-2516a9df36e8?redirectedfrom=MSDN 

https://secuworld.tistory.com/31

 

 

이 글은 (새창열림) 본 저작자 표시, 비영리 규칙 하에 배포할 수 있습니다. 자세한 내용은 Creative Commons 라이선스를 확인하세요.
Creative Commons
본 저작자 표시
비영리

'Forensics' 카테고리의 다른 글

[포렌식] 윈도우 카카오톡 데이터베이스 복호화 분석 및 구현 #1  (69) 2024.03.23
[KDFS] 2021년도 KDFS 디지털포렌식 챌린지 발표자료  (0) 2022.08.20
[KDFS] 2021년도 KDFS 디지털포렌식챌린지 보고서  (0) 2022.08.20
[Autopsy] 온라인 무료 강의 혜택 알림 - Autopsy (Covid19)  (0) 2020.04.18
[Autopsy] #1 - Autopsy 설치하기  (0) 2020.04.14

댓글

댓글을 사용할 수 없습니다.

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [KDFS] 2021년도 KDFS 디지털포렌식 챌린지 발표자료

    [KDFS] 2021년도 KDFS 디지털포렌식 챌린지 발표자료

    2022.08.20
  • [KDFS] 2021년도 KDFS 디지털포렌식챌린지 보고서

    [KDFS] 2021년도 KDFS 디지털포렌식챌린지 보고서

    2022.08.20
  • [Autopsy] 온라인 무료 강의 혜택 알림 - Autopsy (Covid19)

    [Autopsy] 온라인 무료 강의 혜택 알림 - Autopsy (Covid19)

    2020.04.18
  • [Autopsy] #1 - Autopsy 설치하기

    [Autopsy] #1 - Autopsy 설치하기

    2020.04.14
다른 글 더 둘러보기

정보

포렌식 & 개발 이야기 - Forensics & Development 블로그의 첫 페이지로 이동

포렌식 & 개발 이야기 - Forensics & Development

  • 포렌식 & 개발 이야기 - Forensics & Development의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • Category (439)
    • Forensics (104)
      • Magnet AXIOM (28)
      • Digital Forensics Informati.. (9)
      • Iphone Forensics (23)
      • DFC (7)
      • 디지털포렌식전문가2급 자격증 (10)
      • FTK ACE 자격증 (7)
    • 이것저것 (7)
      • Ubuntu (6)
      • 디스코드 봇 (4)
      • Volatility GUI (2)
    • CTF (32)
      • NEWSECU (14)
      • CTF-d (5)
      • Puzzel - Network Forensics (2)
      • Security Traps (2)
      • system32.kr (5)
      • HMCTF (4)
    • Programming (248)
      • C (10)
      • Python (11)
      • 백준 (194)
      • 프로그래머스 (32)
    • 그냥 개발 및 잡담 (16)
      • Docker (2)
      • Google Cloud (3)
      • OS 개발 (3)
    • Best of Best (20)

인기 글

공지사항

태그

  • 프로그래머스
  • Forensics
  • pental
  • axiom
  • 백준
  • 포렌식
  • 디지털포렌식
  • 파이썬
  • 전체 보기…

정보

pental의 포렌식 & 개발 이야기 - Forensics & Development

포렌식 & 개발 이야기 - Forensics & Development

pental

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © pental.

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.