심심해서 워게임을 시작해보았다
기존에 이미 어떤 유튜버를 보고 Ignite를 클리어한 상태였기 때문에 다시 시작하는데에 큰 문제는 없었다.
이번에 도전할 대상은 바로 Lazy admin 실제로 이런 사이트가 얼마나 있을지 모르겠지만 일단 해보겠다.
브루트포스 도중에 심심해서 해당 블로그를 작성해본다.
정보수집
1. 사이트 방문
일단 가장 쉬운 방법으로 사이트에 방문해보았다
자신들이 만든 보안 서비스? 같은걸 실제로 작동한다고 홍보하고 있었는데 잘 모르겠으니 유의미해보이는 폴더 구조 하나만 챙긴다
2. 포트스케닝
포트스케닝 툴은 다들 사용하는 nmap을 이용했으며 다음 명령어를 이용했다
"nmap -Sc -sV [ip] > portscan_file"
해당 스켄을 통해서 22번 포트에서는 OpenSSH 7.2p2 가 작동중이며 80포트에서는 Apache 2.4.18이 작동중이라는 사실을 알 수 있었다
3.공격 정보 수집
사용하는 서비스들에 밝혀진 취약점들이 있는지 찾아보았다
취약점 탐색에는 다양한 방법이 있지만 대표적으로 구글 서칭, 칼리리눅스 내장 코드 이용 등이 있겠다
나는 내장 코드를 이용했다
내장 코드 찾기 명령어"searchsploit [서비스 이름 및 버전]"
이제보니 OpenSSH 7.2p2은 서버 계정 이름 탐색이 가능한 취약점이 있었으며 Apache 2.4.18에는 권한 상승 취약점이 있었다
4.계획
이제 계획을 새워보겠다
일단 OpenSSH의 취약점인 서버 계정 이름 탐색을 통해서 서버 계정 이름 리스트를 찾는다
그러기 위해서는 위에서 검색한 파일의 완벽한 경로(사진에는 일부 경로만 표시됨)를 알아야 하는데 해당 검색은 다음 명령어를 이용할 수 있다
"find / -name "파일 이름" 2>/dev/nul
해당 검색을 통해 당장 필요한 40136.py의 경로가 /usr/share/exploitdb/exploits/linux/remote/40136.py 임을 알 수 있었다
깔끔한 공격을 위해서 kali 폴더 안에 exploits이라는 폴더를 만들어 포트스케닝 결과, 40136.py 경로등을 전부 넣어두었다
해당 명령어는 40136.py를 현재 폴더로 복사하는 명령어이다
"cp /usr/share/exploitdb/exploits/linux/remote/40136.py ." 여기에서 .은 현재 폴더를 나타낸다
5. 실행
한번 많이 사용하는 python3로 실행해보자
오잉? 뭔가 했더니 사용 방법을 알려준다
정리해보자면 "python3 40136.py <host:port> -u <username>" 이게 사용방법 이다
포트는 OpenSSH 7.2p2가 작동중인 22번으로 해준다
그런데 username이 필요하단다
알고보니 이건 우리가 이미 가지고있는 유저 이름들을 모두 대입하여 해당 사용자가 존재하는지 여부를 탐색하는 것
하지만 칼리리눅스는 해당 파일을 내장하고있다
저장 위치는 /usr/share/wordlists 이며 기존의 앞축되어있는 rockyou 파일의 앞축을 gzip 명령어를 통해 풀어주어야 이용 가능하다
문제가 발생했다
문제 1
연결 타임아웃: get_banner 함수에서 SSH 연결 시도 중 타임아웃이 발생했습니다. 이는 대상 호스트에 연결할 수 없음을 의미한다.
def get_banner(host, port):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect(hostname=host, port=port, username='invalidinvalidinvalid', password='invalidinvalidinvalid', timeout=10)
except (socket.timeout, paramiko.ssh_exception.SSHException, paramiko.ssh_exception.NoValidConnectionsError) as e:
return f"Connection failed: {str(e)}"
except Exception as e:
return f"Unexpected error: {str(e)}"
else:
banner = ssh.get_transport().remote_version
ssh.close()
return banner
connect 함수에 타임아웃 매개변수를 추가하고 get_banner 함수를 위 코드와 같이 수정한다
문제 2
파이썬 버전에 따른 time.clock() 함수 제거 : 이 오류는 Python 3.8 이상 버전에서 time.clock() 함수가 제거되었기 때문에 발생한다. 이 문제를 해결하기 위해 time.clock() 함수를 timer()로 변경하고 아레 코드를 추가해야한다
import time
try:
from time import perf_counter as timer
except ImportError:
from time import clock as timer
작은 문제가 있었다
이 오류는 rockyou.txt 파일의 인코딩 문제로 인해 발생한 것이기에 rockyou.txt 파일은 UTF-8이 아닌 다른 인코딩(주로 ISO-8859-1 또는 Latin-1)으로 저장되어 있을 가능성이 높다고 한다
이 문제를 해결하기 위해 다음 명령어를 사용하여 파일의 형식을 변환하면 된다
iconv -f ISO-8859-1 -t UTF-8 rockyou.txt > rockyou_utf8.txt
이제 한번 브루트 포스 공격을 시작해보자
결과는 이런식이다
rockyou 파일에 있는 모든 사용자 명을 무차별 대입해보고 존재하는 사용자를 [+]로 존재하지 않는 사용자를 [-]로 표시한다
혹시 사용자의 비밀번호가 복잡할 경우를 대비해 시간 나는대로 최대한 많은 존재하는 사용자 명을 얻어본다
위 사진에서는 1234567과 12345678이라는 사용자가 존재함을 알 수 있다.
결과가 나왔다 실제 부르트포스 공격 시간은 15분 정도였다
나는 존재하는 사용자 명만 따로 파일로 만들었다
이제 이것을 이용해 존재하는 사용자명들에 부르트포스 공격을 진행해 낮은 권한을 가진 계정을 얻어볼 수 있으며 권한상승 취약점을 이용해 최종적으로 관리자 권한을 얻는 목표에 한발 더 가까워졌다