Firebase Web Hosting 파이어베이스 웹 호스팅
1시간에 한 번 질의하기
그림 12 LOOF 함수
과제에서 요구되던 사항은 1 시간에 1 번씩 도메인의 IP 주소를 수집하는 것이었다.
그래서 사용한 방법은 Python 의 time 모듈을 이용한 time.sleep()이었다.
이 방법을 이용하면 원하는 시간만큼 스크립트의 동작을 멈춘 뒤 다시 실행하도록 할 수 있다.
숫자1은1초를의미하는데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 함수에서 결과를 기입하기 전에 항목의 머리글이 되는 부분을 작성해준 코드이다.
'포렌식 도구 제작 > 서버 정보 수집 도구' 카테고리의 다른 글
터미널 종료 후 스크립트 백그라운드 실행 (0) | 2018.04.20 |
---|---|
CSV 에 결과값 작성하기 (0) | 2018.04.19 |
보조 DNS 서버 (0) | 2018.04.19 |
DOMAIN에 해당하는 외부 서버 IP 주소 찾기 (0) | 2018.04.19 |
터미널 종료 후 스크립트 백그라운드 실행
과터미널이 종료되고 나서도 스크립트를 실행한 프로세스가 백그라운드에서 동작하도록 하자. 처음에는 단순하게 명령어 뒤에 ‘&’를 붙여 백그라운드로 돌리는 방법을 시도해보았다.
하지만 터미널이 종료된 다음 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’라고 명령어를 치면 된다.
'포렌식 도구 제작 > 서버 정보 수집 도구' 카테고리의 다른 글
1시간에 한 번 질의하기 (0) | 2018.04.20 |
---|---|
CSV 에 결과값 작성하기 (0) | 2018.04.19 |
보조 DNS 서버 (0) | 2018.04.19 |
DOMAIN에 해당하는 외부 서버 IP 주소 찾기 (0) | 2018.04.19 |
CSV 에 결과값 작성하기
앞서 [그림 4]의 결과값을 과제 제출용 CSV 파일로 만들어주는 과정이 필요했다.
그림 5 WRITE_CSV 함수
그래서 [그림 5]와 같이 기입될 결과값을 인자로 넘겨받아 CSV 파일에 작성하는 함수를 만들었다. 이때 이 함수는 ‘a’ 옵션으로 파일을 여는데 그 이유는 계속되는 질의 응답의 결과를 이어서 CSV 파일에 계속 기입해야 하기 때문이다.
그림 6 CSV 파일에 결과 기입
[그림 5]의 write_csv 함수를 사용한 결과를 [그림 6]에서 확인할 수 있다. [그림 6]은 3 초에 한번씩 도메인의 IP 주소를 묻는 질의에 DNS 서버의 응답을 정리해 CSV 파일로 기입한 것이다. 사실 이 과정에서 CSV 파일에서 Time 항목에서 초가 잘린 채 값이 보여서 처음에 코딩이 잘못되었나 헤맸었다.
그림 7 CSV 파일 셀서식
확인결과 셀서식에서 사용자 지정으로 초까지 보이게 하는 방법이 있다는 것을 알게되었고 초까지 보이도록 설정해 문제를 해결하였다.
'포렌식 도구 제작 > 서버 정보 수집 도구' 카테고리의 다른 글
1시간에 한 번 질의하기 (0) | 2018.04.20 |
---|---|
터미널 종료 후 스크립트 백그라운드 실행 (0) | 2018.04.20 |
보조 DNS 서버 (0) | 2018.04.19 |
DOMAIN에 해당하는 외부 서버 IP 주소 찾기 (0) | 2018.04.19 |
보조 DNS 서버
앞서 [그림 2]에서 도메인 질의를 할 DNS 서버를 지정할 수 있었다. 하지만 1 시간에 한번씩 도메인의 IP 주소를 확인해야 하는 과제 특성상 도메인 질의 당시 DNS 서버가 응답을 주지 않는다면 원하는 정보를 수집할 수 없게 된다. 따라서 보조적으로 도메인 질의에 응답을 줄 DNS 서버 설정이 필요했다. 그래서 생각했던 로직은 3 개 정도 DNS 서버를 Python 리스트에 저장해두고 하나의 서버가 동작하지 않았을 때 응답하는 DNS 서버를 찾기 위해 3개의 DNS서버에 질의를 하는 for 문을 만들고 최종적으로 도메인에 대한 IP 주소를 받을 때까지 질의를 계속하는 While 문을 for 문 밖에 두는 구조를 생각했다.
그림 3 보조 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]와 같이 과제의 결과로 필요한 항목들이 잘 출력되는 것을 확인하였다.
'포렌식 도구 제작 > 서버 정보 수집 도구' 카테고리의 다른 글
1시간에 한 번 질의하기 (0) | 2018.04.20 |
---|---|
터미널 종료 후 스크립트 백그라운드 실행 (0) | 2018.04.20 |
CSV 에 결과값 작성하기 (0) | 2018.04.19 |
DOMAIN에 해당하는 외부 서버 IP 주소 찾기 (0) | 2018.04.19 |
DOMAIN에 해당하는 외부 서버 IP 주소 찾기
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시간에 한 번 질의하기 (0) | 2018.04.20 |
---|---|
터미널 종료 후 스크립트 백그라운드 실행 (0) | 2018.04.20 |
CSV 에 결과값 작성하기 (0) | 2018.04.19 |
보조 DNS 서버 (0) | 2018.04.19 |
PK ZIP 파일 포맷 1 (local file header)
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의 크기에 포함되어 있다. 구조는 아래와 같다.
sql injection db 공격 쿼리 목록화
php 홈페이지 완성작
'php' 카테고리의 다른 글
php php와 mysql의 연동 / 쿠키와세션1 (0) | 2015.08.03 |
---|---|
php form을 이용한 입력과 출력 (0) | 2015.08.02 |
php mysql 테이블 만들기 수정, 삭제 등 (0) | 2015.08.02 |
php mysql 계정 만들기, 데이터베이스 만들기 (0) | 2015.08.02 |
php 배열 함수 (0) | 2015.08.02 |
php php와 mysql의 연동 / 쿠키와세션1
'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 |