- 전체
- 보안뉴스
- 제로데이취약점
- 해킹프로그래밍
- 웹해킹
- 해킹기법
- 정보보호
- 정보보안기사 - 국가기술자격
- 악성코드분석_리버싱
- 시큐어코딩_개발보안진단원
- CISSP
- CISA
- 모의해킹_penetration-test
- deepweb / tor network
모의해킹_penetration-test 모의해킹(Penetration Testing) PortScanner 8. 업그레이드3 : optparse 기능
2023.03.20 09:05
모의해킹(Penetration Testing) PortScanner 8. 업그레이드3 : optparse 기능
지금까지는 포트 스캐너 자체의 기능을 향상시키는 도구에 대해서 알아보았다. 이전 프로그램들은 다른 방식으로 동작시키려면 코드를 열어서 값을 직접 찾아 수정해야 하는 불편함이 있었다. 이 챕터에서는 지금까지 만든 스캐너를 좀더 동적인 방법으로 기능을 제공하도록 구현하겠다.
optparse 라이브러리는 기본적으로 Python에서 제공된다. 이 라이브러리를 이용하면 Argument를 효과적으로 전달할 수 있다. 아마 여러분은 이런 도움말을 본적이 있을 것이다. 다음은 nmap의 도움말이다.
1
2
3
4
5
6
7
8
|
c:\> nmap -h
Nmap 6.47 ( http://nmap.org )
Usage: nmap [Scan Type(s)] [Options] {target specification}
TARGET SPECIFICATION:
Can pass hostnames, IP addresses, networks, etc.
Ex: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.0-255.1-254
-iL <inputfilename>: Input from list of hosts/networks
... 중략 ...
|
cs |
그리고 nmap 도움말을 참고하여 옵션 값을 전달하면 프로그램 내부에 이 값들을 전달 및 사용하여 프로그램을 진행한다.
1
|
c:\> nmap 192.168.157.133 –sS –sV -O
|
cs |
전에 공부한 것처럼 위에 있는 Arguments의 의미는 이미 알고 있을 것이다. 이렇게 동적으로 프로그래밍을 실행할 수 있다면 프로그램의 유연성은 더욱 커질 것이다. optparse를 사용하여 우리가 만든 스캐너에 간단하고 효과적으로 Argument를 전달해보자.
먼저 간단하게 숫자와 연산 방법을 전달하는 프로그램을 만들어보자. 간단한 테스트를 통하여 여러분은 optparse의 기능들을 파악할 수 있을 것이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#! python
#! -*- coding: utf-8 -*-
# simple optparse calculater
import optparse
# optparse
parser = optparse.OptionParser('usage Calc.py -n <tgtNum> -o <operation>')
parser.add_option('-n', dest='tgtNum', type='string', help='write numbers with comma')
parser.add_option('-o', dest='operation', type='string', help='specify operation + - * / %')
(option, args) = parser.parse_args()
# 전역 변수 초기화
tgtNum = option.tgtNum.split(',')
oper = option.operation
operStr = ""
# 연산자 붙이기
for num in tgtNum:
operStr += num + oper
# 마지막 연산자 제거
operStr = operStr[:-1]
#결과 출력
print('result is ' + str(eval(operStr)))
|
cs |
이제 cmd 창으로 이 프로그램을 실행하여 여러 가지 테스트를 해보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
C:\> calculater.py -h
Usage: usage Calc.py -n <tgtNum> -o <operation>
Options:
-h, --help show this help message and exit
-n TGTNUM write numbers with comma
-o OPERATION specify operation + - * / %
C:\> calculater.py
usage Calc.py -n <tgtNum> -o <operation>
C:\> calculater.py -n 1,1,1,1,1 -o +
reuslt is 5
C:\> calculater.py -n 1,2,3,4,5 -o *
result is 120
|
cs |
‘-h’를 삽입한 경우 도움말을, 정확한 option을 넣지 않았을 경우에 usage 메시지를 띄우고 있다. 또한 값을 전달하여 argument를 사용한 결과를 나타낸다.
코드 분석
8
|
parser = optparse.OptionParser('usage Calc.py -n <tgtNum> -o <operation>')
|
cs |
parser 객체를 만들면서 기본적인 도움말을 입력할 수 있다.
9
10
|
parser.add_option('-n', dest='tgtNum', type='string', help='write numbers with comma')
parser.add_option('-o', dest='operation', type='string', help='specify operation + - * / %')
|
cs |
add_option() 함수를 사용하면 옵션으로 사용할 agurment들에 대해 정의할 수 있으며, 간단한 도움말도 삽입가능하다. 첫 번째 인자(‘-n’)는 옵션 사용시 명시할 옵션 값이고, dest는 어떤 변수에 값을 넣을 지 정한다. type은 읽는 값의 type을 명시할 수 있으며, help에는 옵션에 대한 간단한 도움말을 입력할 수 있다.
11
|
(option, args) = parser.parse_args()
|
cs |
커맨드 라인으로부터 받은 값을 option에 저장한다.
13
14
15
|
# 전역 변수 초기화
tgtNum = option.tgtNum.split(',')
oper = option.operationoperStr = ""
|
cs |
전역변수 초기화 시에 커맨드라인으로부터 전달 받은 값들을 각 변수에 전달한다. 첫 번째 옵션인 tgtNum 같은 경우는 split() 함수를 사용하고 있는 데 이 함수는 문자열을 쉼표 단위로 나누어서 list 형식으로 전달한다. 다음 예제를 보면서 이해하자.
1
2
3
4
5
6
|
>>> str1 = '1,2,3,4,5'
>>> list1 = str1.split(',')
>>> list1
['1', '2', '3', '4', '5']
>>> list1[0]
'1'
|
cs |
억지로 어렵게 비효율적인 프로그램을 만들었지만 이 프로그램을 통해서 optparse의 역할에 대해서 잘 이해했을 거라 생각한다. 여기서 중요한 부분은 주석으로 쓰여진 ‘#optparse’와 ‘#전역 변수 초기화’ 부분이다. nmap에 optparse를 적용하기 전에 충분히 이해하도록 하자.
3) Nmap Scanner에 optparse 적용하기
마지막 업그레이드인 optparse를 추가한 Nmap Scanner이다. 여러분들 또한 스스로 프로그래밍을 해보기 바란다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#! python
# -*- coding: utf-8 -*-
# PortScanProgram with nmap Library
import nmap
import time
import datetime
import os.path
import os
import optparse
#optparse
parser = optparse.OptionParser('usage PortScanner -t <tgtHost> -p <tgtPort> -n <nmapOption>')
parser.add_option('-t', dest='tgtHost', type='string', help='must specify target Host')
parser.add_option('-p', dest='tgtPort', type='string', help='must specify target Port')
parser.add_option('-n', dest='nmapOption', type='string', help='specify nmapOption')
(option, args) = parser.parse_args()
if (option.tgtHost == None) | (option.tgtPort == None):
print(parser.usage)
exit(0)
# 전역 변수 초기화
startTime = time.time() # 시작 시간 기록
nm = nmap.PortScanner() # nmap 객체 생성
hostList = option.tgtHost.split(',') # 호스트 리스트 작성
portList = option.tgtPort # 포트 리스트 작성
if option.nmapOption:
myArg = option.nmapOption # 옵션 설정
# 폴더 생성
fileList = [] # 파일 이름 저장할 리스트 생성
dirName = 'scan_result' # 폴더 이름 지정
if not os.path.exists('./' + dirName): # 폴더 없을 시 폴더 생성
os.system('mkdir ' + dirName)
print (dirName + " directory is made\n")
else: # 폴더 존재 시 폴더 생성 안 함
print (dirName + " directory exists already\n")
if not os.path.isdir(dirName): # 해당 파일이 폴더가 아닐 경우 오류 발생
print ("Err: Same name file exists with directory name")
exit() # 프로그램 종료
# 스캔 시작
for host in hostList:
host = host.strip() # 사용자가 공백을 입력했을 경우를 위해 스트립함
... 이하 7.5 예제와 동일 ...
|
cs |
실행화면
1
2
3
4
5
6
7
8
9
10
11
|
C:\> PortScanner.py -h
Usage: usage PortScanner -t <tgtHost> -p <tgtPort> -n <nmapOption>
Options:
-h, --help show this help message and exit
-t TGTHOST specify target Host
-p TGTPORT specify target Port
-n NMAPOPTION specify nmapOption
C:\> PortScanner.py –t “192.168.157.133, 127.0.0.1” –p 20-443 –n “-sS –sV –O”
... 결과 출력(결과는 PortScanner)와 동일하다. ...
|
cs |
공백을 포함한 옵션 값 전달 시에는 쌍따옴표(“)가 필요하다. 위 예제의 명령어에서 쌍따옴표를 삽입하여 다수의 옵션 값과 리스트를 전달한다.
특별하게 볼만한 코드는 이 코드이다.
45
|
host = host.strip() # 사용자가 공백을 입력했을 경우를 위해 스트립함
|
cs |
사용자가 host 주소를 공백을 사용하여 전달했을 시에 공백을 제거하여 host 값으로 넘겨주는 코드이다. 입력 값 전달 시 오류가 발생하지 않도록 사용자 입력 값에 대한 여러 경우의 수를 고려해야 한다.
optparse는 사용 방식이 동일하기 때문에 [8.2 optparse 작성하기]를 잘 이해했다면 이 예제 또한 이해하기 매우 쉬웠을 것이다.
optparse에 대한 설명은 여기까지다. 매우 단순하지만 큰 편리함을 제공하는 만큼 앞으로도 계속 이 라이브러리를 사용하여 프로그래밍 할 것이다. 위 예제에서는 디렉터리를 생성하여 결과 파일들을 저장하는데 디렉터리 이름을 선택적으로 받을 수 있도록 코드를 수정해보길 권한다(옵션 입력 시, 디렉터리 이름을 수정하고, 옵션 입력 없을 시, Default 값 세팅하도록 만들어보자). 스스로 직접 코딩을 해봄으로 여러분의 실력을 크게 향상시킬 수 있을 것이다.
[출처] https://m.blog.naver.com/isc0304/220376569369
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.