PostgreSQL은 오픈소스 객체-관계형 데이터베이스 관리 시스템(RDBMS)이다. 다양한 기능과 확장성을 지원하여 다양한 응용 프로그램에서 데이터 관리를 위해 사용되는 서비스이다.

테스트 환경은 Ubuntu 20.04이며, 아래 명령어를 사용하여 PostgreSQL을 설치할 수 있다.

$ sudo apt update
$ sudo apt install postgresql postgresql-contrib

설치를 마친 postgreSQL은 기본적으로 localhost에서만 접근 가능하도록 설정되어 있다. 통신 테스트를 위해 외부로부터 들어오는 트래픽을 허용하도록 설정 파일을 수정해야 한다. 시스템 내에서 postgresql.conf 파일을 찾아 파일 내 listen_addresses 값을 아래와 같이 변경한다.

$ sudo nano /etc/postgresql/12/main/postgresql.conf

listen_addresses = "*"

그 후 5432 포트에 대한 방화벽을 설정하고 postgresql을 재시작 하면 서버 구축이 완료된다.

$ sudo ufw allow proto tcp from any to any port 5432
$ sudo systemctl restart postgresql

 

구축된 서버와의 통신을 위해 클라이언트 프로그램으로 python의 ‘psycopg2’ 라이브러리를 사용하였다. 이 라이브러리를 이용하여 postgreSQL 서버에 접속 요청을 보낸 후 응답 결과에 따라 5432 포트에서 서비스 실행 여부를 식별하였다. 테스트를 위해 작성한 코드는 아래와 같다.

코드 작성 시 Connection refused 오류를 반환할 경우 서비스되고 있지 않은 것으로 판단하였으며, 그 이외에 연결 성공하거나 인증 오류가 날 경우에는 서비스 중인 것으로 판단하였다.

import psycopg2

def test_PostgreSQL(server_ip):
	result = ""
    
    try:
    	db = psycopg2.connect(host=server_ip, dbname="testdb",
        					user="postgres", password="password", port=5432)
    except psycopg2.OperationalError as e:
    	message = e.args[0]
        
        if "FATAL:  no pg_hba.conf entry" in message:
        	result = "authentification error"
        elif "Connection refused" in message:
        	result = "no service"
        else:
        	result = "on service"
    return result

if __name__ == "__main__":
	server_ip = "ip address"
    print(test_PostgreSQL(server_ip))

'Penetration testing' 카테고리의 다른 글

서비스 식별: Submissions (587)  (0) 2023.09.01
서비스 식별: SMTPS (465)  (0) 2023.09.01
서비스 식별: HTTPS (443)  (0) 2023.09.01
서비스 식별: LDAP (389)  (0) 2023.09.01

Submissions 서비스에 사용되는 587번 포트는 인증 없이 메일을 전송할 수 있게 하는 SMTP로 인해 발생하는 문제를 해결하고자 사용되는 포트이다. 인증이 필요 없다는 특징을 악용하여 스팸 메일이 늘어나자 이를 막기 위한 정책인 OP25B가 사용되었는데, 이러한 정책으로 인해 오히려 정상적인 사용자의 가용성이 침해되는 경우가 발생하였다. 그리하여 이를 해결하기 위해 587번 포트를 사용해 SMTP를 사용하면서도 인증 과정을 거치도록 하였고 이것으로 보안성을 높이면서 가용성 문제를 해결할 수 있었다. 이러한 이유로 submission 포트 587번은 근본적으로는 SMTP 메일 서비스와 같으며 따라서 SMTP와 비슷한 방법으로 서비스 식별이 가능하다.

메일 서버 구축 방법은 ‘서비스 식별: SMTPS (465)’를 참고하여 진행할 수 있다. 

테스트를 위해 사용한 클라이언트 프로그램은 2.1.26 SMTPS에서 사용한 것과 같은 python의 ‘smtplib’ 라이브러리를 사용하였다. 587번 포트를 이용하여서도 SMTP 프로토콜을 이용해 통신할 수 있다. 테스트 시 사용한 코드는 아래와 같다. SMTP 메소드는 주어진 host, port와 SMTP 연결을 맺기 위한 요청을 보낸다. 따라서 587번 포트에 SMTP 서버가 서비스 중이 아닐 경우 연결을 맺는데 실패하여 에러가 발생한다. 이를 이용하여 SMTP 서버의 서비스 여부를 판단하였다.

import smtplib

def test_Submissions(mail_server):
	try:
    	smtp = smtplib.SMTP(host=mail_server, port=587)
        smtp.quit()
        print('on success')
    except:
    	print('no service')

if __name__ == "__main__":
	server_ip = 'ip address'
    test_Submissions(server_ip)

 

이 과정을 네트워크 패킷 레벨에서 확인하면 다음과 같다.

[그림 1]은 SMTP 서버가 동작 중일 경우에 해당하며, 정상적으로 TCP 3-way handshake를 맺은 후 SMTP 연결을 위한 메시지를 교환하는 것을 확인할 수 있다. [그림 2]는 SMTP 서버가 동작 중이지 않을 경우에 해당하며, TCP SYN 패킷에 대한 응답으로 TCP RST 패킷이 반환되는 것을 볼 수 있다.

그림 1
그림 2

 

'Penetration testing' 카테고리의 다른 글

서비스 식별: PostgreSQL (5432)  (0) 2023.09.01
서비스 식별: SMTPS (465)  (0) 2023.09.01
서비스 식별: HTTPS (443)  (0) 2023.09.01
서비스 식별: LDAP (389)  (0) 2023.09.01

SMTPS(Simple Mail Transfer Protocol Secure)는 전자메일을 보내고 받을 때 사용되는 프로토콜인 SMTP의 보안 버전이다. HTTPS와 마찬가지로 송수신되는 데이터를 암호화하여 전자메일 통신의 보안을 강화할 수 있다.

SMTPS도 HTTPS와 같이 TLS 암호화를 사용하기 때문에 SMTPS 서버 구축 시 SSL 인증서 발급을 필요로 한다. SSL 인증서 발급에 대해서는 ‘서비스식별: HTTPS (443)’를 참고하여 진행할 수 있다.

SMTPS 서버 구축을 위해서는 기본적인 메일 서버를 구축해야 한다. 이를 위해 ‘Ubuntu 20.04’ 운영체제를 사용하였으며 서비스는 ‘Postfix’를 사용했다. 부가적으로 ‘Dovecot, MySQL’ 서비스도 함께 사용하였다. 구축 과정이 상당히 길기 때문에 이에 대해 적는 대신 아래 링크를 참고하면 된다.

 

How To Configure a Mail Server Using Postfix, Dovecot, MySQL, and SpamAssassin | DigitalOcean

 

www.digitalocean.com

메일 서버 구축이 끝나면 mxtoolbox.com/SuperTool.aspx 라는 링크에서 구축한 메일서버에 대한 테스트를 간단히 진행할 수 있다.

 

이렇게 서버 구축을 하고 나면 기본적인 SMTP 메일 서버로의 기능을 사용할 수 있다. 그러나 이 상태에서 서버의 네트워크 연결 상태를 확인하면 465번 포트는 활성화되어 있지 않을 것이다. Postfix에서는 465번 포트를 활성화시키기 위해 별도로 설정 파일을 수정해야 한다. 이에 대한 과정도 참고할 수 있도록 링크를 남겨둔다. 이 과정까지 마치면 비로소 465번 포트를 이용하여 SMTPS 통신을 수행할 수 있게 된다.

 

Enable SMTPS Port 465 in Postfix SMTP Server For Email Submission

This tutorial will be showing you how to enable SMTPS port 465 in Postfix SMTP server, so Microsoft Outlook users can send emails. SMTPS stands for Simple Mail Transfer Protocol Secure.

www.linuxbabe.com

 

통신 테스트를 위해 python의 ‘smtplib’ 라이브러리를 사용하여 간단한 테스트 코드를 작성하였다. 이 코드는 SSL을 사용하여 SMTP 연결을 시도한다. 연결 시도 시 SSL 프로토콜을 필요로 하기 때문에 SMTP 서버이더라도 SMTPS 통신을 사용하지 않을 경우 SMTPS 서비스로 판단하지 않는다.

import smtplib

def test_SMTPS(mail_server):
	result = ''
    try:
    	smtp = smtplib.SMTP_SSL(mail_server, 465)
        smtp.quit()
    except:
    	result = 'no service'
    else:
    	result = 'on service'

if __name__ == "__main__":
	mail_server = '<mail server domain or IP address>'
    print(test_SMTPS(mail_server))

 

이러한 과정을 네트워크 패킷 레벨에서 확인한 결과는 다음과 같다. 

연결 성공 시 TCP 3-way handshake에 성공하며 그 이후 암호화 통신을 사용하여 데이터를 교환한다. [그림 1] 그러나 연결에 실패할 경우 서버로부터 TCP RST 패킷을 반환 받는다. [그림 2]

그림 1
그림 2

 

'Penetration testing' 카테고리의 다른 글

서비스 식별: PostgreSQL (5432)  (0) 2023.09.01
서비스 식별: Submissions (587)  (0) 2023.09.01
서비스 식별: HTTPS (443)  (0) 2023.09.01
서비스 식별: LDAP (389)  (0) 2023.09.01

HTTPS(Hypertext Transfer Protocol Secure)는 HTTP의 보안 버전으로, SSL/TLS 프로토콜을 사용하여 데이터를 암호화 후 전송하는 방식을 사용한다. 이를 통해 제3자가 패킷을 감청하더라도 데이터를 확인하기 어렵게 하여 안전한 통신 채널을 설정할 수 있다.

HTTPS의 테스트를 위해서는 SSL 인증서를 발급받아야 한다. 인증서를 발급받기 위해서는 사전에 도메인 발급이 필요하며 발급된 도메인이 있을 경우 곧바로 SSL 인증서 발급 절차를 거치면 된다. 테스트를 위해 사용하는 임시 인증서 발급을 목적으로 하기 때문에 무료로 인증서 발급이 가능한 ‘Let’s Encrypt(LE)’라는 인증기관의 인증서를 사용하였다.

다음은 인증서 발급에 사용된 command line 명령어이다. 이 과정에서 추가로 ‘openssl’과 ‘certbot라이브러리가 사용되었다. 서버 구성 시 사용한 운영체제는 ‘Ubuntu 20.04’ 버전이다.

$ openssl genrsa -des3 -out server.key 2048
$ openssl rsa -in server.key -out server.key.insecure
$ openssl rsq -new -key server.key -out server.csr
$ mv server.key server.key.secure
$ mv server.key.insecure server.key
$ sudo git clone https://github.com/certbot/certbot /opt/cerbot && cd /opt/cerbot
$ sudo snap install certbot --classic
$ sudo certbot certonly -d <domain>

인증서 발급 후 이를 테스트하고자 하는 웹서버에 적용하면 된다. 여기서는 ‘Apache’ 웹서버를 사용하였으며 Apache 웹서버에 SSL 인증서를 등록하는 과정은 [참고 문헌 1]을 참고하여 진행할 수 있다.

테스트 시 클라이언트 프로그램으로는 ‘curl’ 명령어를 사용하였다. 이 때 -k 옵션을 사용할 경우 https 프로토콜을 이용하여 연결을 맺을 수 있다.

$ curl -k https://yutaa.kr

서버에 https가 서비스되고 있을 경우 응답 값으로는 해당 url에서 서비스되고 있는 웹페이지를 받을 수 있다. [그림 1] 그러나 만약 서비스되고 있지 않을 경우에는 [그림 2]와 같은 응답을 확인할 수 있다.

그림 1
그림 2

이러한 과정을 네트워크 패킷 레벨에서 확인하면 다음과 같다.

서버에서 https가 서비스되고 있을 때에는 TCP 3-way handshake 후 암호화된 패킷 형태로 데이터를 교환하는 것을 확인할 수 있다. [그림 3] 그러나 https가 서비스되고 있지 않을 때에는 TCP SYN 패킷이 전송된 이후 TCP RST 응답이 오는 것을 확인할 수 있다. [그림 4]

그림 3
그림 4

 

'Penetration testing' 카테고리의 다른 글

서비스 식별: PostgreSQL (5432)  (0) 2023.09.01
서비스 식별: Submissions (587)  (0) 2023.09.01
서비스 식별: SMTPS (465)  (0) 2023.09.01
서비스 식별: LDAP (389)  (0) 2023.09.01

LDAP(Lightweight Directory Access Protocol)은 네트워크 상에서 directory 서비스 내 데이터에 접근하고 관리할 수 있도록 하기 위한 프로토콜이다. 클라이언트와 서버 구조로 통신하며, 이를 테스트하기 위해 간단한 ldap 서버를 구축하였다.

서버는 MacOS 환경에서 OpenLDAP을 사용하여 구축하였다. 구축 과정은 아래 링크를 참고하여 진행할 수 있다.

 

5분 안에 구축하는 LDAP

Microsoft 에서 개발한 AD(Active Directory)는 디렉토리 서비스 공급자이며 윈도우OS 에서 디렉터리 안에 내용을 쉽게 검색 할 수 있도록 한다. 이런 공급자들이 쉽게 통신을 하기 위한 프로토콜이 LDAP(Li

co-de.tistory.com

 

서버 구축 후에는 아래 명령어를 이용하여 ldap 서비스를 구동할 수 있다.

$ sudo /usr/libexec/slapd -h ldap://localhost -d 50

 

테스트를 위한 클라이언트 프로그램으로는 ‘ldapsearch’를 이용하였으며, 이 때 사용한 명령어는 다음과 같다.

$ ldapsearch -x -D "uid=user1,ou=group-01,dc=test,dc=com" -H ldap://localhost -b "ou=group-01,dc=test,dc=com" -w asdf

명령어 구성 시 실제 접속에 필요한 도메인 정보 등은 무시한 채 임의의 데이터를 사용했다. 이는 현재 진행하는 작업이 서비스 접속 성공이 아닌 서비스 식별이기 때문에 이 부분에 초점을 맞추기 위함이다. 따라서 인증 실패 응답이 올 경우에도 해당 포트에서 서비스가 제공되고 있는 것으로 판단하였다. 실제로 포트가 열려있으며, 해당 포트에서 ldap 서비스가 제공 중일 경우 아래와 같이 인증 실패 응답을 확인할 수 있다.

ldap_bind: Invalid credentials (49)

만약 해당 포트에서 ldap이 서비스되고 있지 않을 경우에는 아래와 같은 응답을 확인할 수 있다.

ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)

이러한 과정을 네트워크 패킷 레벨에서 확인하면 다음과 같다.

서버에서 ldap이 서비스되고 있을 때에는 TCP 3-way handshake 후 LDAP 형태로 메시지를 교환한다. 그러나 ldap이 서비스되고 있지 않을 때에는 ldapsearch의 TCP SYN 패킷 이후 ICMP 형태로 Destination unreachable 응답이 오는 것을 확인할 수 있다.

ldap 서비스 중일 때
ldap 서비스 중이 아닐 때

 

'Penetration testing' 카테고리의 다른 글

서비스 식별: PostgreSQL (5432)  (0) 2023.09.01
서비스 식별: Submissions (587)  (0) 2023.09.01
서비스 식별: SMTPS (465)  (0) 2023.09.01
서비스 식별: HTTPS (443)  (0) 2023.09.01

+ Recent posts