파이썬
함수의 종료 시점
- 내부에서 리턴문을 만났을 때
- 실행문이 끝났을 때
함수가 정의되면 메모리에 생성된다
함수는 정의가 먼저 나온 후 호출이 뒤에 나온다
순서가 뒤집히면 에러 발생
def function():
print("test")
def gugudan(number=0):
for i in range(1,10):
print(number, " * ", i, " = ", (number * i)) //문자열과 더하기
print(f'{number} * {i} = {number * i}') //fprint 방식
function()
gugudan(2)
def keyword(a, b, c):
print(a, b, c)
keyword(b=2, c=1, a=3) //키워드 방식
keyword(1, c=3, b=2) //positional 포지셔널 방식 둘을 섞어쓸경우 첫번째 인수는 무조건 포지셔널로 써야 한다
이때, 공백을 주지 않았는데 왜 출력값이
3 2 1
1 2 3
이렇게 나올까? 이유는 기본 sep 매개변수가 " " 이기 때문
def keyword(a, b, c):
print(a, b, c, sep='')
수정하면
321
123
이렇게 붙어서 나온다
+ end 매개변수의 경우 기본값은 \n이다
print(a, b, c, sep='', end='-')
이렇게 수정하면
321-123-
이렇게 개행이 사라지고 -가 맨 끝에 붙어서 출력된다
클래스
class 클래스이름:
def 함수명:
코드
클래스이름.함수명() 으로 사용
class testClass:
def keyword(a, b, c):
print(a, b, c, sep='')
testClass.keyword(b=2, c=1, a=3)
testClass.keyword(1, c=3, b=2)
instance method 인스턴스 메서드 (self를 메소드에 적어주어야 함)
- 인스턴스를 파라미터로 받는다
class testClass2:
def function1(self):
print("test self")
class2 = testClass2()
class2.function1()
인스턴스 메서드의 호출방법
class testClass2:
def function1(self):
print(f'{self.name} : {self.count} 개')
item = testClass2()
item.name = 'itemName'
item.count = 3
testClass2.function1(item) //출력 itemName : 3 개
item.function1() //출력 itemName : 3 개
인스턴스 메서드의 파라미터가 여러개일 때
class testClass2:
def function1(self):
print(f'{self.name} : {self.count} 개')
def function2(self, email):
print(f'{self.name} : {self.count} 개')
print(f'담당자 연락처 : {email}')
item = testClass2()
item.name = 'itemName'
item.count = 3
item.function2('test@naver.com')
# item.function2(item, 'test@naver.com') 는 에러가 난다 self 자리는 비워줄것
# testClass2.function2(item, 'test@naver.com')는 에러 안남
== 출력결과
itemName : 3 개
담당자 연락처 : test@naver.com
모듈
함수, 변수, 또는 클래스들을 모아놓은 파이썬 파일
import 예약어를 사용하여 불러온다. 현재 디렉토리 또는 파이썬 라이브러리가 저장된 디렉토리에 있는 모듈만 불러올 수 있다
sys.path를 이용해 파이썬 라이브러리 디렉토리 확인가능
import sys
print(sys.path)
== 출력 결과
['/home/kali/VENVTEST', '/usr/lib/python311.zip', '/usr/lib/python3.11',
'/usr/lib/python3.11/lib-dynload', '/home/kali/VENVTEST/.venv/lib/python3.11/site-packages']
모듈 호출하기
exModule1.py
def printA():
print("A")
def printB():
print("B")
printA()
printB()
exModule2.py
import exModule1
== 출력 결과
A
B
F5 > F11로 호출된 모듈의 내부를 확인할 수 있다
보통 직접실행은 막히므로 실무에서는 함수를 이용
import exModule1
exModule1.printA()
exModule1.printB()
모듈로 불러서 실행했으므로 __name__ 에는 모듈명이 들어가있다
if __name__ == '__main__':
printA()
printB()
모듈에 이러한 코드를 넣으면, 직접실행할때는 자동으로 함수를 실행하지만
모듈로 불러서 실행할 때는 함수를 자동으로 실행하지 않고 직접 호출하여야 한다
--- 파이썬 기초 끝 ---
네트워크를 통해 시스템에 연결하는 방법
1) BIND connection
- 타겟Victim이 포트를 열어주면 공격자가 접속 시도, 방화벽이 없으면 접속가능
2) REVERSE connection
- 타겟Victim이 공격자쪽으로 접속하는 형태
공격자 : 100.3
타겟 : 100.6
$ sudo systemctl stop firewalld
$ sudo systemctl stop iptables
둘 중 하나로 타겟의 방화벽을 내린다
sudo dnf -y install wget gcc make glibc glibc.i686
필요한 패키지들 설치
wget등으로 nc 공식 홈페이지에서 다운로드 받아서
( http://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz )
cd netcat-0.7.1/
./configure
make
sudo make install
컴파일
ll /usr/local/bin/{netcat,nc}
설치확인
타겟에서
$ nc -lvp 8000
nc로 포트를 열면
$ netstat -nltp | grep nc
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 5271/nc
다른 터미널에서 조회시 포트가 열린걸 확인할 수 있다
$ nc 192.168.100.6 8000
공격자에서 nc로 접속
Connection from 192.168.100.3:45964
접속하면 타겟에 로그가 뜬다
데이터 전송도 가능
22번 포트를 통한 패킷만 허용하는 방화벽 룰을 추가하자, 접속로그가 뜨지 않는다
타겟에서 방화벽 설정
sudo iptables -F
sudo iptables -A INPUT -m state --state INVALID -j DROP
sudo iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -j DROP
타겟에서 공격자로 접속된다
$ sudo iptables -nvL INPUT
Chain INPUT (policy ACCEPT 33627 packets, 75M bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 state INVALID
92 7046 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state ESTABLISHED
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 458 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
ESTABLISHED 패킷 룰이 있어야 상호연결된다
해당 룰로 매칭된것이 확인됨
네트워크를 통해 원격으로 시스템에 연결하는 방법
1) Bind shell ( Bind connection을 이용한 쉘 탈취 )
2) REVERSE shell ( REVERSE connection을 이용한 쉘 탈취 )
리버스 쉘 (공격자(칼리)에서 pwd 명령어가 실행된 상태)
소켓(네트워크 통신) 프로그래밍
참고
소켓 라이브러리 레퍼런스
https://docs.python.org/2/library/socket.html
https://docs.python.org/3/library/socket.html
서버
1) 서버 소켓 (리스닝)
클라이언트로부터 연결 요청을 대기하다가 요청이 오면 연결을 맺고
통신할 클라이언트 소켓을 새로 생성한다
2) 클라이언트 소켓 (커넥션)
클라이언트와 통신하기 위한 소켓
클라이언트
1) 커넥션 소켓 (커넥션)
서버와 통신하기 위해 생성한 소켓
서버로 연결을 요청하고 데이터를 전송한다
파이썬에서 사용시
import socket
socket.bind(주소)
socket.listen(백로그)
socket.accept() //접속 연결 수락
socket.connect(주소)
socket.send(문자열)
socket.recv(버퍼사이즈)
socket.close()
데이터를 보내보고
conn에 recv 하여 데이터를 받는다
반대의 경우