# 커버로스 유저 이름 정보수집

### 개념

윈도우의 사용자 인증 프로토콜 중 하나인 커버로스 (Kerberos) 프로토콜은 특정 유저 이름이 존재하는지에 대한 요청에 존재한다/존재하지 않는다라는 응답을 보낸다. 더 정확하게 설명하자면, 공격자가 유저 이름만 가지고 `KRB_AS_REQ` (커버로스 Authentication Service 요청) 을 보내면 도메인 컨트롤러는 다음과 같이 응답한다.

* 유저 계정 존재 - `KRB5KDC_ERR_PREAUTH_REQUIRED` - 유저가 존재하지만 커버로스 인증 6단계 중 첫 2단계인 Pre-Authentication 이 필요하다는 에러를 반환한다.
* 유저 계정 존재 X - `KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN` - 액티브 디렉토리 내 존재하지 않는 Principal 이라는 에러를 반환한다.

에러 메시지들의 차이 이용해 공격자들은 준비해놓은 유저 이름 리스트를 이용해서 어떤 유저 이름이 존재하는지 존재하지 않는지 확인할 수 있다 - 이를 커버로스 유저 이름 정보수집 (Kerberos Username Enumeration) 이라고 부른다.

커버로스 유저 이름 정보수집을 통해 얻은 도메인 유저 이름들은 다음과 같은 공격에 사용될 수 있다.

1. [비밀번호 스프레이](https://www.xn--hy1b43d247a.com/credential-access/password-spraying) (Password Spraying)
2. 비밀번호 브루트포스 (Password Bruteforcing) - 실무에서는 계정 잠금 정책 (Account Lockout Policy) 때문에 잘 사용하지 않는 편이다.
3. [AS-REP Roasting](https://www.xn--hy1b43d247a.com/credential-access/kerberos/as-rep-roasting)
4. [커버로스팅](https://www.xn--hy1b43d247a.com/credential-access/kerberos/kerberoasting) (Kerberoasting) - 이미 도메인 유저 맥락을 갖고 있다면 커버로스팅을 진행할 수 있다

### 실습

1. 브루트포스 할 유저 이름 리스트를 구한다. 대부분의 액티브 디렉토리 유저 이름은 직원 이름 (ex. `s.choi@choi.local`) 인 경우가 많지만, 서비스 유저 계정 (`svc-scanner@choi.local`, `o365-mfa@choi.local`) 들의 경우 비슷비슷하게 설정해놓는 경우가 많아 브루트포스를 통해 발견할 수도 있다.

수많은 유저 이름 리스트가 존재하지만, 실습에서는 간단한 리스트를 이용한다.

```
wget https://raw.githubusercontent.com/Sq00ky/attacktive-directory-tools/master/userlist.txt .
```

2\. [Kerbrute](https://github.com/ropnop/kerbrute) 를 통해 브루트포스를 진행한다

```
wget https://github.com/ropnop/kerbrute/releases/download/v1.0.3/kerbrute_linux_amd64 .
chmod +x ./kerbrute_linux_amd64
mv kerbrute_linux_amd64 kerbrute

./kerbrute userenum -d <domain> --dc <DC-IP> <userlist-file> | tee <output-filename> 
```

![](https://1805673931-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtMFEdQUk1veqYea72hvC%2Fuploads%2Fgit-blob-e70b3f7f265c93597a20ffd0e01dd494f70becc5%2Fimage.png?alt=media)

3\. 알아챈 유저 이름 리스트를 갖고 Password Spraying, AS-REPRoasting, Kerberoasting 등을 진행한다.

### 대응 방안

* 원천적으로 커버로스 유저 이름 정보수집을 막는 방법은 없다 - 적어도 마이크로소프트사나 커버로스를 만든 MIT에서 커버로스 프로토콜 자체를 바꾸지 않는 한 없다.
* 단, 특정 IP주소나 도메인 유저 맥락을 통해 짧은 시간 안에 커버로스 유저 이름 확인 요청을 보내는 공격자를 탐지할 수 있는 방법은 있다. 방어자들은 탐지 후 공격자를 특정하여 격리하는 식으로 이 공격에 대응할 수 있다.

### 레퍼런스

{% embed url="<https://research.nccgroup.com/2015/06/10/username-enumeration-techniques-and-their-value/>" %}

{% embed url="<https://research.splunk.com/endpoint/d82d4af4-a0bd-11ec-9445-3e22fbd008af/>" %}

{% embed url="<https://github.com/attackdebris/kerberos_enum_userlists>" %}
