먼저 firebase 웹 페이지를 가면 위와 같은 페이지가 보입니다.
 see our new web site를 클릭합니다. 


현재 위 그림에서는 구글 로그인이 된 상태입니다. 
파이어베이스는 구글 계정으로 로그인을 해야 사용할 수 있습니다.
우측 상단에 콘솔로 이동하기를 눌러줍니다


그리고 새 프로젝트를 만드기 위해 새 프로젝트 만들기를 눌러 줍니다.


프로젝트 이름을 자신이 원하는 것으로 정해준 뒤 국가/지역을 
대한민국으로 설정하고 프로젝트 만들기를 눌러 줍니다.


그러면 위와 같은 페이지가 뜨는데요. 왼쪽에 여러 메뉴 중에 Hosting 이라는 메뉴가 보입니다. 
우리는 웹 페이지를 만들기 위해서 호스팅을 해야 하므로 Hosting 메뉴를 눌러줍니다.


그러면 이렇게 시작하기 라는 버튼이 뜹니다. 또 눌러 줍니다.

자신의 PC에 node.js가 설치되어 있지 않다면 먼저 설치해주어야 합니다.


Firebase 도구를 설치하기 위해 입력해야 하는 명령어가 보입니다. 
먼저 이 명령어를 치기 전에 해야 하는 작업이 있습니다. 


바로 툴을 설치할 경로를 만들어 줘야 합니다. 
저는 위와 같이 C드라이브에 firebase_test 라는 폴더를 만들었습니다.


그리고 윈도우 키 + r 을 누르고 cmd 라고 입력하면 뜨는 명령어프롬프트에 
위에서 보았던 firebase tool을 설치하기 위한 명령어를 쳐 줍니다.
위에서 node.js를 깔라고 말씀 드렸는데 안깔려 있으면 명령어가 제대로 동작하지 않습니다. 
그리고 중요한게 아까 만들어 놓은 폴더로들어가서 명령어를 실행해줘야 합니다.
참고로 말씀드리면 폴더에서 빠져나오는 명령어는 cd.. 이고요 폴더 안으로 들어가는 명령어는 cd 폴더명 입니다.  


명령어를 친 뒤 firebase tool이 정상적으로 설치된 모습입니다.


호스팅 설정에서 다음을 누르면 또 명령어를 입력하고 뜹니다. 똑같이 명령어프롬프트에 쳐주면 됩니다.


firebase login을 쳤는데 저는 이미 로그인이 되어있어서 이미 로그인 되어있다고 뜨네요. 
그리고 계속 진행할거냐고 y/n로 물어보고 있는데 
y를 치고 엔터를 치면 됩니다. 
그 뒤에 다른 것도 그냥 엔터를 치면 됩니다. 


저는 이미 만들어 놓은 프로젝트가 많아서 어떤 프로젝트를 쓸래 하고 물어봤습니다. 
아까 만들었던 Test 폴더를 선택한 뒤 엔터를 쳐줍니다.


호스팅을 위해서 아까 지정한 폴더에 public이란 폴더를 만들고 index.html을 넣어 준다구 합니다. 
y 하고 엔터 해줍니다.


마지막 명령어를 칩니다.


완료.

아까 만들어 놓았던 firebase_test 폴더를 가보면 여러 파일들이 만들어 진 것을 확인할 수 있습니다. 


public 폴더 안에 들어가면 html 파일이 있는 것을 확인할 수 있습니다. 


호스팅이 완료되면 배포 기록이 생깁니다. 





그림 12 LOOF 함수


과제에서 요구되사항은 1 시간에 1 번씩 도메인의 IP 주소를 수집하는 것이었다

그래서 사용한 방법은 Python time 모듈을 이용한 time.sleep()이었다

이 방법을 이용하면 원하는 시간만스크립트의 동작을 멈춘 뒤 다시 실행하도록 할 수 있다

11를의미하는1시간은그3600가된다.loof 함수에는 while 로 작성된 무한루프가 어있고 이 함수는 도메인 질의의 주기가 되는 시간과 도메인을 매개변수로 받는다


[그림 12]17 에서 3600 과 도메인 ‘fl0ckfl0ck.info’달받은 loof 함수는 4 에서 [그림 2]dns_query 함수에 실행 결과를 5 data 리스트로 정리해 6 [그림 4]write_csv 함수에게 결과값을 csv 로 기입하도록 한9 에서 3600 시간 정지에 어간다

3600 그러1 시간이 지이후 3 while 문에 따라 해당 동작을 반복하게 된다.

12 ~15 write_csv 함수에서 결과를 기입하기 에 항목의 이 되는 부분을 작성해준 코드이다.


터미널이 종료되고 서도 스크립트를 실행한 프로세스가 백그라운드에서 동작하도록 하자. 음에는 단하게 명령어 ‘&’여 백그라운드로 리는 방법을 시도해보았다

하지만 터미널이 종료된 다음 jobs 명령어와 ps –ef 명령어로 확인해보백그라운드 동작이 멈춰있었다. 그래서 찾은 방법은 ‘nohup’ 을 이용하는 것이었다.


‘nohup’ 리눅스, 스에서 스크립트파일 (*.sh)데몬형태로 실행시. 따라서 터미널 세션이 겨도 실행을 추지 않고 동작하도록 한다

여기서 주의사항은 ‘nohup’ 을 실행할 스크립트는 미션이 755 상태여야 한다는 것이다


‘&’는 백그라운드로 프로세스를 실행하기 때문에 터미널의 세션이 기면 프로세스의 실행이 종료된다. ‘nohup’은 프로세스 실행시 hang-up signal 이 와도 프로세스가 계속 동작하기 때문에 터미널 세션이 도 실행을 추지 않는 차이점이 있다.






그림 7 NOHUP 으로 스크립트 실행


[그림 7]에서 nohup python3 dns_ip.py & 명령어를 통해 스크립트를 실행시켰다.




그림 8[그림8] 명령어 실행 이후


[그림 7]의 명령어에서 실행한 스크립트가 있는 더에 nohup.out 파일과 dns_result.csv 파일이 생성된 것을 [그림 11]를 통해 확인할 수 있었다. nohup.out 파일에는 스크립트 동작 중 출되는 내용이 기록된다.



그림 9 NOHUP.OUT 파일


Python 스크립트에 결과를 출하는 소스코드가 nohup.out 에 기록되는 것을

확인할 수 있었다.
프로세스가 정로 터미널 세션이 끊긴 뒤에도 동작하는지 확인해보았다.



그림 10 터미널 종료 프로세스 동작 확인


[그림 10]과 같이 터미널을 종료하기 [그림 7]에서 실행한 프로세스가 동작하고

있는지 확인했다. 2:11am 에 프로세스가 실행된 것을 수 있다.



그림 11 터미널 종료 후 프로세스 동작 확인


터미널을 종료하고 2:15:10am 에 터미널을 다시 프로세스의 동작 여부를 확인해보았다


그리고 [그림 11]와 같이 2:11am 에 실행시프로세스가 계속 동작 중인 것을 수 있었다


게 백그라운드에서 동작 중인 프로세스를 종료하기 위해선 [그림11]와 같이 “ps–ef|grep‘실행파일 명’”을 통해 PID 를 확인한 ‘kill PID’라고 명령어를 면 된다.



[그림 4]의 결과값을 과제 제출용 CSV 파일로 만어주는 과정이 요했다.




그림 5 WRITE_CSV 함수


그래서 [그림 5]와 같이 기입결과값을 인자로 넘겨받아 CSV 파일에 작성하는 함수를 만었다. 이때 이 함수는 ‘a’ 션으로 파일을 여는그 이유는 계속되는 질의 응답의 결과를 이어서 CSV 파일에 계속 기입해야 하기 때문이다.


그림 6 CSV 파일에 결과 기입


[그림 5]write_csv 함수를 사용한 결과를 [그림 6]에서 확인할 수 있다. [그림 6]3 에 한번씩 도메인의 IP 주소를 는 질의에 DNS 서버의 응답을 정리해 CSV 파일로 기입한 것이다. 사실 이 과정에서 CSV 파일에서 Time 항목에서 잘린 채 값이 보여서 음에 코못되었나 헤맸었다.



그림 7 CSV 파일


확인결과 에서 사용자 지정으로 까지 보이게 하는 방법이 있다는 것을 게되었고 까지 보이도록 설정해 문제를 해결하였다.

[그림 2]에서 도메인 질의를 할 DNS 서버를 지정할 수 있었다. 하지만 1 시간에 한번씩 도메인의 IP 주소를 확인해야 하는 과제 특성상 도메인 질의 당시 DNS 서버가 응답을 주지 않는다면 원하는 정보를 수집할 수 없게 된다. 따라서 보조적으로 도메인 질의에 응답을 DNS 서버 설정이 요했다. 그래서 생3 개 정도 DNS 서버를 Python 리스트에 저장해고 하의 서버가 동작하지 않았을 때 응답하는 DNS 서버를 찾기 위해 3개의 DNS서버에 질의를 하는 for 문을 만고 최종적으로 도메인에 대한 IP 주소를 받을 때까지 질의를 계속하는 While 문을 for 는 구조를 생했다.



그림 보조 DNS 서버 설정 소스코드


[그림 3]Python dns.resolver 모듈을 이용한 보조 DNS 서버 설정 소스코드이다. 서 설명했것과 같이 [그림 3]3 을 보면 저 국외 DNS 서버의 IP 주소 를 foreign_dns 리스트에 저장했다. 그리고 7 for 문을 사용해 3 의 리스트에서 국외 DNS 서버 인자를 하빼오도록 하였고 8 에서는 DNS 서버에 질의할 때 트워크 연결이 겨서 오류는 것과 같은 상을 염try, except 문을 사용하였다. 그리고 10 에서 7 for 문의 인자인 국외 서버 DNS 를 가와 질의를 한질의를 한 시간을 11 에서 now 변수에 설정해for 문을 가도록 했다.


내가 정한 3개의 국외 DNS 서버에서 한 번의 for문을 거치는 것으로 도메인에 해당하는 IP 주소를 확인할 수 있다면 좋겠지만 만약의 경우에 for 문을 한 번 거치로는 원하는 응답을 못을 수 있다고 생6 while 문을 무한루프를 돌려 16 IP 주소 변수에 값이 있을 때까지 도메인 질의를 하는 for 문을 반복하도록 하였다. 그리고 23 에서는 질의를 한 시간, 도메인의 IP 주소, 질의에 사용된 DNS 서버를 함수 동작 결과값으로 보내주도록 하였다



그림 4 DNS_QUERY 함수 결과값


[그림 3]dns_query 함수를 3 에 한번씩 질의하게 한 결과를 터미널에 출되도록 하였다. 그 결과 [그림 4]와 같이 과제의 결과로 요한 항목되는 것을 확인하였다.


mac 운영체제에서 수행했으며 사용한 언어는 Python3.6 이다. 우선, domain 으로 IP 주소를 확인하는 방법을 검색하다가 Python socket 모듈을 이용한 방법을 발견했다.



그림 1 SOCKET 모듈을 이용한 DNS QUERY


[그림 1]Python socket 모듈의 gethostbyname() 함수를 통해 매개변수로 넘겨준 도메인의 IP 주소 를 확인할 수 있다. 매우 간단한 명령어로 수행할 수 있었다. 하지만 국내 서버가 아닌 해외 DNS 서버를 지정해 수행해야 하기 때문에 해당 스크립트로 해결할 수 없었다. 그래서 다음으로 내가 지정한 DNS 서버에 DNS 쿼리를 질의하는 방법을 찾아보았다.



그림 2 DNS.RESOLVER 모듈을 이용한 DNS QUERY


[그림 2][그림 1]socket 모듈을 이용할 때와는 다르게 Python 외장 라이브러리 dnspython dns.resolver 모듈을 이용하여 DNS 서버 지정해 도메인을 질의한다. [그림 2]를 보면 r.nameservers = [‘8.8.8.8’] 와 같이 DNS 서버를 지정할 수 있다. 과제에서 요구 조건으로 국외 DNS 서버에 질의하고, 해당 DNS 서버에서 응답을 받지 못하는 경우를 생해 보조 DNS 를 고해야 하므로 [그림 2]의 방으로 수행하기로 하였다.


1 PK Zip 파일 구조 분석

1.1 PK Zip 파일

 PK Zip 파일 형식은 데이터를 압축해서 보관하기 위해 사용된다. 데이터 압축에는 여러 종류의 알고리즘이 있지만 현재는 deflate 알고리즘이 주로 쓰인다. PK Zip 파일은 파일 확장자로 ‘.Zip’이나 ‘.Zip’을 사용한다. 이번 ‘2016 포렌식챌린지’에서 대상이 된 Zip 파일은 PK Zip 파일이다. 이 후에 내용은 PK Zip 파일의 포맷과 메타데이터 정보에 대한 것이다. 

1.2 PK Zip 파일의 전체 구조

 전체적인 구조를 먼저 살펴보자. 각각의 PK Zip 파일은 아래의 [그림 1]을 따른다.

 일련의 Local file descriptor들은 각각 한 개의 Local file header와 실제로 압축되거나 암호화된 데이터뿐만 아니라 조건적으로 Data descriptor를 갖는다. Data descriptor의 존재 여부는 Local file header의 플래그에 달려있다. Data descriptor에 뒤에는 Archive decryption header가 있다. 이 헤더는 PK Zip 파일의 버전이 6.2이거나 그보다 더 높을 때만 존재한다. Archive decryption header는 Central directory가 암호화되거나 암호화에 대한 특정 정보를 포함하고 있을 때만 나타난다. Archive extra data 항목은 모든 PK Zip 파일에서 보이지 않고 6.2버전 이상에서만 볼 수 있다. 해당 부분은 Central directory의 암호화나 압축에 대한 정보로 사용된다.

1.3 Local file header

1.3.1 Local file header의 구조

 Local file header의 구조를 살펴보자.


 [그림 2]는 Local file header의 전체적인 구조를 보여준다. 보이는 바와 같이 Local file header는 Signature, Version, Flags, Compression, Modified time, Modified date, Crc-32-32, Compressed size, Uncompressed size, file name length, Extra file length, file name, Extra 항목들로 구성되어 있다. 

Signature부터 Extra length까지의 항목은 차지하는 값의 크기가 일정하게 정해져 있다. 하지만, file name, Extra 항목의 경우 앞선 file name length와 Extra field length에 따라서 Local file header의 길이가 변할 수 있다.  

1.3.2 Local file header의 항목

항목

설명

Signature

Local file header의 Signature이다. 이 항목은 항상 ‘504B0304h’값을 가진다.

Version

PK Zip 파일을 추출할 때 필요한 버전을 담고 있는 항목이다.

Flags

PK Zip 파일을 추출할 때 필요한 플래그를 담고 있는 항목이다.

Bit 00: encrypted file

Bit 01: compression option 

Bit 02: compression option 

Bit 03: Data descriptor

Bit 04: enhanced deflation

Bit 05: compressed patched data

Bit 06: strong encryption

Bit 07-10: unused

Bit 11: language encoding

Bit 12: reserved

Bit 13: mask header values

Bit 14-15: reserved


Compression

PK Zip 파일을 만들 때 사용된 압축 방식을 나타내는 항목이다. 

00: no compression

01: shrunk

02: reduced with compression factor 1

03: reduced with compression factor 2 

04: reduced with compression factor 3 

05: reduced with compression factor 4 

06: imploded

07: reserved

08: deflated

09: enhanced deflated

10: PKWare DCL imploded

11: reserved

12: compressed using BZip2

13: reserved

14: LZMA

15-17: reserved

18: compressed using IBM TERSE

19: IBM LZ77 

98: PPMd version I, Rev 1 

Modified time

표준 MS-DOS 포맷을 따라 저장된 수정된 시간을 나타내는 항목이다.

Bits 00-04: seconds divided by 2 

Bits 05-10: minute

Bits 11-15: hour

Modified date

표준 MS-DOS 포맷을 따라 저장된 수정된 날짜를 나타내는 항목이다.

Bits 00-04: day

Bits 05-08: month

Bits 09-15: years from 1980

Crc-32-32

리틀 에디안 방식에 따라 ‘magic number’ DEBB20E3h를 가지고, Crc-32-32알고리즘을 사용해 압축된 데이터의 변조를 감지하는 체크섬을 나타내는 항목이다.

Compressed size

압축된 데이터의 크기를 나타내는 항목이다. 이 항목의 경우 archive가 PK Zip 파일 구조에 있을 경우 ‘FFFFFFFFh’를 따르고 실제 압축된 데이터의 길이는 extra 항목에 저장된다.


Uncompressed size

압축되기 전 데이터의 크기를 나타내는 항목이다. 이 항목의 경우 archive가 PK Zip 파일 구조에 있을 경우 ‘FFFFFFFFh’를 따르고 실제 압축된 데이터의 길이는 extra 항목에 저장된다.

file name length

아래의 항목인 file name의 길이를 나타내는 항목이다. 즉, 압축된 파일의 이름 길이를 나타낸다.

Extra file length

아래의 항목인 Extra 항목의 길이를 나타내는 항목이다. 즉, 추가적인 내용을 나타내는 부분의 길이를 나타낸다. 

file name

파일이 존재하는 경로를 포함한 압축된 파일의 이름을 나타내는 항목이다. 모든 경로는 ‘/’를 포함하여 나타난다. 

Extra 

추가적인 정보를 저장하기 위해 사용되는 항목이다. 

1.3.3 Local file header의 실제 예시

 [그림 3]은 한 Local file header의 실제 값들을 보여준다.

 [그림 4]는 [그림 3]에서 나타나는 헥사값을 Local file header의 항목에 맞춰서 나타낸 것이다. 

 

[그림 4]에서 나타낸 Local file header의 항목에 대한 정보를 나타낸 것이다. Local file header이기 때문에 Signature로 ‘504B0304h’를 가진다. 해당 PK Zip 파일을 추출할 때 필요한 버전이 20으로 나타나 있다. flag 항목의 비트 값이 0인 것으로 압축된 파일임을 알 수 있고 compress 항목을 통해 deflate 알고리즘을 사용해 압축된 파일이라는 것을 확인할 수 있었다. 시간 정보는 16:53:38, 날짜 정보는 03/15/2012이다. Crc-32-32값과 압축된 데이터의 크기, 압축되기 전 데이터의 크기를 항목에서 확인할 수 있으며 파일의 이름은 ‘SWM_Setup.exe’이고 길이는 13인 것을 알 수 있다. 또한 Extra field length가 0이므로 Extra는 존재하지 않았다. 

1.4 Data descriptor

 Data descriptor는 Local file header의 Flag 항목에 따라 나타난다. 이 경우 Local file header의 Crc-32-32와 compressed size 그리고 uncompressed size 항목은 0이 된다.

1.5 Archive decryption header

 Archive decryption header는 Central directory가 암호화 되었을 때 사용된다. 이 data 항목의 포맷은 앞선 압축된 데이터의 decryption header와 동일하다. 

1.6 Archive extra data 

 Archive extra data도 마찬가지로 Central directory가 암호화 되었을 때 사용된다. 이 data 항목의 크기는 End of Central directory 항목에 directory의 크기에 포함되어 있다. 구조는 아래와 같다.















 

 

 

 

 

 

 

 

 

 

 

 

 

 

'php' 카테고리의 다른 글

php 홈페이지 완성작  (0) 2015.08.08
php form을 이용한 입력과 출력  (0) 2015.08.02
php mysql 테이블 만들기 수정, 삭제 등  (0) 2015.08.02
php mysql 계정 만들기, 데이터베이스 만들기  (0) 2015.08.02
php 배열 함수  (0) 2015.08.02

+ Recent posts