> For the complete documentation index, see [llms.txt](https://redryan.gitbook.io/studyjoon/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://redryan.gitbook.io/studyjoon/hacking/bhpt/undefined-4/http/mysql.md).

# MySQL 취약점 진단

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FbRu9IblNlS80mDvh0dqA%2Fimage.png?alt=media&amp;token=aaa1d141-25b6-424d-97bd-b5a4751a4682" alt=""><figcaption></figcaption></figure>

## 취약점 진단 <a href="#bkmrk-ec-b7-a8-ec-95-bd-ec-a0-90-ec-a7-84-eb-8b-a8" id="bkmrk-ec-b7-a8-ec-95-bd-ec-a0-90-ec-a7-84-eb-8b-a8"></a>

MySQL은 데이터베이스이기 때문에 데이터베이스와 관련된 취약점 진단을 진행합니다.

* 접근 제어: MySQL을 네트워크에 노출할 시, 정해진 IP주소들에서 정해진 프로세스들이 정해진 계정 정보를 가지고 접근하도록 접근 제어를 설정해야합니다. 접근 제어 설정을 잘못한 경우, 네트워크 내 MySQL을 사용하면 안되는 호스트나 공격자들이 데이터베이스에 접근할 수 있게 됩니다.
* 기본 계정 및 단순한 사용자명/비밀번호: 데브옵스(DevOps), 커스텀 배포 스크립트, 혹은 수동으로 MySQL 서버들을 배포하다보면 하드코딩된 기본 계정이나 간단한 사용자명 및 비밀번호를 그대로 사용하는 경우가 있습니다. 예를 들어 `root:password`, `root:root`, `dbadmin:password` 등의 계정 정보를 사용하는 경우가 있습니다. 따라서 이러한 단순한 계정 정보들의 사용여부를 점검해야합니다. 이러한 진단을 수행할 때는 계정 잠금이 일어나는 상황을 방지하기 위해 브루트공격 방식을 지양합니다.
* 데이터베이스 확인: 원격에서 데이터베이스에 접근이 가능한 경우, 데이터베이스 안의 데이터를 확인합니다.
  * 저장/미사용 데이터 암호화 (Encryption at Rest): 민감하거나 개인정보와 관련된 데이터들이 데이터베이스 안에 존재할 때, 암호화나 마스킹(Masking) 된 상태로 저장되어 있는지 확인합니다.
  * 비밀번호 해시화: 비밀번호가 데이터베이스 안에 저장되어 있다면, 해시화되어 저장됐는지 확인합니다.
  * 해시 알고리즘 확인: 해시화된 데이터가 있을 시 보안적으로 취약점이 없는 안전한 해시 알고리즘이 사용됐는지 확인합니다.

## 실습 <a href="#bkmrk-ec-8b-a4-ec-8a-b5" id="bkmrk-ec-8b-a4-ec-8a-b5"></a>

### 1. Nmap 기본 스캔 <a href="#bkmrk-nmap-ea-b8-b0-eb-b3-b8-ec-8a-a4-ec-ba-94" id="bkmrk-nmap-ea-b8-b0-eb-b3-b8-ec-8a-a4-ec-ba-94"></a>

```sql
nmap -p 33060,33061 -Pn -n --open -sV --script="mysql*" <아이피>
```

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FTEWuHNSBV9RdJKevytfj%2Fimage.png?alt=media&amp;token=2f5ee775-1504-482a-8556-2d6082baf8ab" alt=""><figcaption></figcaption></figure>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FKvVS061EryW0aSoPdyWa%2Fimage.png?alt=media&amp;token=31789144-78a0-403b-a278-4054a1a5835c" alt=""><figcaption></figcaption></figure>

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FRSMxbcxdVLC3SyFUrFe4%2Fimage.png?alt=media&amp;token=07b31008-e9ce-487a-b754-336a5f987918" alt=""><figcaption></figcaption></figure>

### 2. MySQL 접근 <a href="#bkmrk-mysql-ec-a0-91-ea-b7-bc" id="bkmrk-mysql-ec-a0-91-ea-b7-bc"></a>

```sql
mysql -u <유저> -p -h <아이피/호스트이름> -P <포트> 
mysql -u root -p -h 172.31.1.1 -P 33060
```

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2F1514eJQ57Lzy4yOiZnAn%2Fimage.png?alt=media&amp;token=e2b30229-e4f8-4c59-90d3-9b7246563566" alt=""><figcaption></figcaption></figure>

* nmap 이 거짓 양성 결과를 가져다줬다.
* root:root로 접속해본다. 접속 완료!!

### 3. MySQL 사용 <a href="#bkmrk-mysql-ec-82-ac-ec-9a-a9" id="bkmrk-mysql-ec-82-ac-ec-9a-a9"></a>

{% code lineNumbers="true" %}

```sql
# 데이터베이스 확인 
show databases;

# 데이터베이스 사용 
use <데이터베이스>; 

# 테이블 확인 
show tables; 

# 테이블 내 모든 열 & 행 확인 
select * from <테이블>; 

# 특정 열(column) 내 특정 문자열 확인  
select * from <테이블> where lower(<열>) like '%<문자열>%'; 

# 예) 유저 이름 열 중 Garcia가 포함된 행의 username, password 반환 
MySQL [production]> select username,password from users where lower(username) like '%garcia%';
+-------------+------------+
| username    | password   |
+-------------+------------+
| garcia.liam | LiamG#2023 |
+-------------+------------+
```

{% endcode %}

* select \* from users;

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2F8OhIq6BXxPIfwBVn0jJJ%2Fimage.png?alt=media&amp;token=85fb7d9d-e034-476c-97b3-3abf93371af2" alt=""><figcaption></figcaption></figure>

* 평문으로 저장된 비밀번호/해싱 된 비밀번호 등이 적혀 있다. -> 취약점에 해당한다.
* 22번 부터는 해싱 된 비밀번호이다.

{% code lineNumbers="true" %}

```sql
hash-identifier
HASH : [해쉬 복붙]
```

{% endcode %}

<figure><img src="https://287627346-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ysBTUxkIeOC7SqTEZ2L%2Fuploads%2FJva8dgob97TJbMZhvFGG%2Fimage.png?alt=media&amp;token=bb44c867-9423-4617-bb1f-e6f1dcc8137b" alt=""><figcaption></figcaption></figure>

* MD4는 예전 해싱 알고리즘이며, 이 알고리즘은 원래 문자열로 되돌릴수 있다 -> 취약점에 해당한다.
* 다른 해싱 알고리즘을 사용하도록 권고해야 한다.

### 4. 원격 데이터베이스 덤프 후 암호화,해시화 등 확인 <a href="#bkmrk-ec-9b-90-ea-b2-a9-eb-8d-b0-ec-9d-b4-ed-84-b0-eb-b2-a0-ec-9d-b4-ec-8a-a4-eb-8d-a4-ed-94-84-ed-9" id="bkmrk-ec-9b-90-ea-b2-a9-eb-8d-b0-ec-9d-b4-ed-84-b0-eb-b2-a0-ec-9d-b4-ec-8a-a4-eb-8d-a4-ed-94-84-ed-9"></a>

{% code lineNumbers="true" %}

```sql
# 특정 데이터베이스 내 특정 테이블 덤프 
mysqldump -h <아이피/dns> -u <유저> -p -P <포트> <DB이름> <테이블이름> > <파일이름>
mysqldump -h 172.31.198.21 -u root -p -P 33060 production users > usertabledump.sql

# 특정 데이터베이스 전체 덤프 
mysqldump -h <아이피/dns> -u <유저> -p -P <포트> <DB이름> > <파일이름>
mysqldump -h 172.31.198.21 -u root -p -P 33060 production > productiondbdump.sql

# 예 
┌──(root㉿kali)-[~/groot]         
└─# mysqldump -h 172.31.198.21 -u root -p -P 33060 production users > usertabledump.sql
Enter password:                  
                                       
┌──(root㉿kali)-[~/groot]      
└─# cat usertabledump.sql
```

{% endcode %}

### 5. 데이터베이스 덤프 파일 포멧 <a href="#bkmrk-eb-8d-b0-ec-9d-b4-ed-84-b0-eb-b2-a0-ec-9d-b4-ec-8a-a4-eb-8d-a4-ed-94-84-ed-8c-8c-ec-9d-bc-ed-8" id="bkmrk-eb-8d-b0-ec-9d-b4-ed-84-b0-eb-b2-a0-ec-9d-b4-ec-8a-a4-eb-8d-a4-ed-94-84-ed-8c-8c-ec-9d-bc-ed-8"></a>

{% code lineNumbers="true" %}

```sql
# 포멧 
< 데이터베이스 버전, 호스트 IP, 데이터베이스 이름 등의 메타데이터 >
-- MariaDB dump 10.19  Distrib 10.11.4-MariaDB, for debian-linux-gnu (x86_64)
--                                  
-- Host: 172.31.198.21    Database: production
-- ------------------------------------------------------
-- Server version       8.1.0 

# 테이블의 열 이릌, 종류 등 
< --- Table structure for talbe <테이블> --- >
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (                                                         
  `id` int NOT NULL AUTO_INCREMENT,                                            
  `username` varchar(50) NOT NULL,                                             
  `password` varchar(255) NOT NULL,                                            
  PRIMARY KEY (`id`)                                                           
) 

# 테이블안에 들어가 있는 데이터 
< --- -- Dumping data for table `users` --- >
LOCK TABLES `users` WRITE;
/*!40000 ALTER TABLE `users` DISABLE KEYS */;
INSERT INTO `users` VALUES
(1,'GrootADMINBHPT@2244','admin'),
(2,'P@ssw0rd123','jackson.ellie'),
(3,'Br0wn!eL0ve','brown.mia'),
[ . . . ]
```

{% endcode %}

### 연습 문제 <a href="#bkmrk-ec-97-b0-ec-8a-b5-eb-ac-b8-ec-a0-9c" id="bkmrk-ec-97-b0-ec-8a-b5-eb-ac-b8-ec-a0-9c"></a>
