포렌식 도구 제작
- Firebase Web Hosting 파이어베이스 웹 호스팅 2018.05.28
- 1시간에 한 번 질의하기 2018.04.20
- 터미널 종료 후 스크립트 백그라운드 실행 2018.04.20
- CSV 에 결과값 작성하기 2018.04.19
- 보조 DNS 서버 2018.04.19
- DOMAIN에 해당하는 외부 서버 IP 주소 찾기 2018.04.19
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 |