「スパマー」またはOracle DB + UTL_SMTP + SSL / TLSの追跡

ユーザーNike01の出版物「How I sent spam」を読んで、この記事を書くようになりました 。 このマニュアルでは、Oracleデータベースを使用してユーザー資格情報を送信するための同様のタスクを設定しました。 SMTPリレーは、認証にSSLを使用するYandex送信メッセージサーバーである必要がありました。







情報収集



Nike01のように 、私は最初にUTL_MAILパッケージを探し始めました。 実際、このパッケージはUTL_SMTPおよびUTL_TCPの「ラッパー」であり、主に単純なメールメッセージを送信することを目的としており、ユーザーがSMTPプロトコルの複雑な操作を行わないようにします。 残念ながら、UTL_MAILにはSMTP認証のサポートの欠如など、いくつかの制限があり、したがって、私の問題の解決には適していません。



さらに、判明したUTL_SMTPパッケージのドキュメントに目を向けました-これは、SMTP認証のサポートを含むほぼすべてのSMTPプロトコルコマンドを使用できるかなり強力で柔軟なツールであり、データベースバージョン11.2.0.2以降ではSTARTTLSも使用できます。 必要なもの!



メールサーバーに渡します。 smtp.yandex.ruの使用に関するヘルプから、サービスがポート465でリッスンしていることがわかります。









わかった 接続を確立しようとしています:



[oracle@ora_db ~]$openssl s_client -connect smtp.yandex.ru:465 CONNECTED(00000003) depth=2 C = PL, O = Unizeto Technologies SA, OU = Certum Certification Authority, CN = Certum Trusted Network CA verify return:1 depth=1 C = RU, O = Yandex LLC, OU = Yandex Certification Authority, CN = Yandex CA verify return:1 depth=0 C = RU, O = Yandex LLC, OU = ITO, L = Moscow, ST = Russian Federation, CN = smtp.yandex.ru, emailAddress = pki@yandex-team.ru verify return:1 --- Certificate chain 0 s:/C=RU/O=Yandex LLC/OU=ITO/L=Moscow/ST=Russian Federation/CN=smtp.yandex.ru/emailAddress=pki@yandex-team.ru i:/C=RU/O=Yandex LLC/OU=Yandex Certification Authority/CN=Yandex CA 1 s:/C=RU/O=Yandex LLC/OU=Yandex Certification Authority/CN=Yandex CA i:/C=PL/O=Unizeto Technologies SA/OU=Certum Certification Authority/CN=Certum Trusted Network CA --- Server certificate -----BEGIN CERTIFICATE----- MIIGtzCCBZ+gAwIBAgIQeNdVGMktXbH0GDaX1lgg9TANBgkqhkiG9w0BAQsFADBf MQswCQYDVQQGEwJSVTETMBEGA1UEChMKWWFuZGV4IExMQzEnMCUGA1UECxMeWWFu ZGV4IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRIwEAYDVQQDEwlZYW5kZXggQ0Ew HhcNMTUxMDEyMTI0MTI0WhcNMTcxMDExMTI0MTI0WjCBmjELMAkGA1UEBhMCUlUx EzARBgNVBAoMCllhbmRleCBMTEMxDDAKBgNVBAsMA0lUTzEPMA0GA1UEBwwGTW9z Y293MRswGQYDVQQIDBJSdXNzaWFuIEZlZGVyYXRpb24xFzAVBgNVBAMMDnNtdHAu eWFuZGV4LnJ1MSEwHwYJKoZIhvcNAQkBFhJwa2lAeWFuZGV4LXRlYW0ucnUwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDfdYJIwjSdhSwHdNxNJ+2TH8jc l2Skm4k6Z9UTDcxCMbe8rvkEg3bu7EUPnftNmBGxB3KXNj73irZ6PLRu3bO7psi3 hbWNRVDzQlcdQZmW/Iucd8IQlvN1gwDZ79eu1fWmRMThmNmiiKK1AjtZNTc+Dq/9 kTl4TkRzdge6KpkOn3lJFwiTozixxKKfawxQSlFpRadzLuYt2Cj88Huo3R5frwwH 8nTMDITtHZVSSYw1cYNIWj+y5G3D1TA1pKcyIPI8WHqJeHIekI3t4uK9JQNEaJI0 clabA3fn1wdJ4jCWajdLcssJ9PJ6eJB+l4HZFt3EDhe8XiQ/69gZjQVIVrcpAgMB AAGjggMxMIIDLTAMBgNVHRMBAf8EAjAAMGkGA1UdHwRiMGAwL6AtoCuGKWh0dHA6 Ly9jcmxzLnlhbmRleC5uZXQvY2VydHVtL3ljYXNoYTIuY3JsMC2gK6AphidodHRw Oi8veWFuZGV4LmNybC5jZXJ0dW0ucGwveWNhc2hhMi5jcmwwcQYIKwYBBQUHAQEE ZTBjMCwGCCsGAQUFBzABhiBodHRwOi8veWFuZGV4Lm9jc3AtcmVzcG9uZGVyLmNv bTAzBggrBgEFBQcwAoYnaHR0cDovL3JlcG9zaXRvcnkuY2VydHVtLnBsL3ljYXNo YTIuY2VyMB8GA1UdIwQYMBaAFDdc4xngso6hqE7Sz6vQ3OMLXDVNMB0GA1UdDgQW BBQYy748oNmcZPHfTrybOrdqeu/mTDAOBgNVHQ8BAf8EBAMCBaAwggE/BgNVHSAE ggE2MIIBMjCCAS4GDCqEaAGG9ncCBQEKAjCCARwwJQYIKwYBBQUHAgEWGWh0dHBz Oi8vd3d3LmNlcnR1bS5wbC9DUFMwgfIGCCsGAQUFBwICMIHlMCAWGVVuaXpldG8g VGVjaG5vbG9naWVzIFMuQS4wAwIBAhqBwFVzYWdlIG9mIHRoaXMgY2VydGlmaWNh dGUgaXMgc3RyaWN0bHkgc3ViamVjdGVkIHRvIHRoZSBDRVJUVU0gQ2VydGlmaWNh dGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQgKENQUykgaW5jb3Jwb3JhdGVkIGJ5IHJl ZmVyZW5jZSBoZXJlaW4gYW5kIGluIHRoZSByZXBvc2l0b3J5IGF0IGh0dHBzOi8v d3d3LmNlcnR1bS5wbC9yZXBvc2l0b3J5LjAdBgNVHSUEFjAUBggrBgEFBQcDAQYI KwYBBQUHAwIwEQYJYIZIAYb4QgEBBAQDAgbAMHoGA1UdEQRzMHGCDnNtdHAueWFu ZGV4LmJ5gg5zbXRwLnlhbmRleC5reoIPc210cC55YW5kZXguY29tgg5zbXRwLnlh bmRleC51YYISc210cC55YW5kZXguY29tLnRyggpzbXRwLnlhLnJ1gg5zbXRwLnlh bmRleC5ydTANBgkqhkiG9w0BAQsFAAOCAQEAoVcDTfHCdx1N6IF0rBtZTxJBu2Tf WcSYGu/Uif6EqqVsy44kQ8Yxresaqb8bR0FkJxSP1HXDwQuXm18sdZDb4f/ealF4 Hb6ZmF5ilP0SNUccka4wI0DDTuMuBDstGbCvLJPxTjHTWP9HYrYoAJsUnux92blR Uc11XnKQE9ltWEpKys9RQhTLDqPNrALa423zvN5jLKqMK6vVzuTIOnrOQFZMDxmQ KVVUtvGS7ZBmL8Z8ripEDBUFywAcxHC9DJpTUwxZUs2ceJbuN6J0qKjP2F/aKJZR GTgW095M/H1tEGjouYfSj21cy9ZDNiUqN1Yutg0+nGNexiRDghg44yWMeQ== -----END CERTIFICATE----- subject=/C=RU/O=Yandex LLC/OU=ITO/L=Moscow/ST=Russian Federation/CN=smtp.yandex.ru/emailAddress=pki@yandex-team.ru issuer=/C=RU/O=Yandex LLC/OU=Yandex Certification Authority/CN=Yandex CA --- No client certificate CA names sent Server Temp Key: ECDH, prime256v1, 256 bits --- SSL handshake has read 3581 bytes and written 373 bytes --- New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256 Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-AES128-GCM-SHA256 Session-ID: C64B0AE4863B7F1A44ED0981E29F4D1E796F98F7FB0EF950A7A1588232F11ABC Session-ID-ctx: Master-Key: F704953E4A95AD4A1C06BBDF1425F4E5B1E2B8BE5EE5214484AC0DF9219E7185ABB38573904FA3CFD0B88A8FF3185061 Key-Arg : None Krb5 Principal: None PSK identity: None PSK identity hint: None TLS session ticket lifetime hint: 300 (seconds) TLS session ticket: 0000 - b3 08 e7 79 5b 86 ba 5a-7e 71 bf f8 5f ad 66 4a ...y[..Z~q.._.fJ 0010 - 5b 4b c6 fe e4 ae 95 21-6e 60 b8 84 bd 09 8e 91 [K.....!n`...... 0020 - ba a4 1e 29 b8 fc 7c 5b-72 16 ae 7e f6 f7 a9 e5 ...)..|[r..~.... 0030 - 69 0a 4e 41 03 cc 79 3a-b4 f7 6d 99 81 a6 a2 ef i.NA..y:..m..... 0040 - c8 27 02 50 1d 68 0b 70-1f d1 d4 1a b7 d9 99 b8 .'.Php....... 0050 - b0 6d 47 ee 89 7d 5d 37-bd ab 89 a7 d2 d2 3d 1d .mG..}]7......=. 0060 - 2f e1 4b 85 ae eb ab de-3a f7 e2 18 ce 55 48 3b /.K.....:....UH; 0070 - 15 14 8f 69 45 bc 8a a4-77 b1 a0 8f 41 96 ea c7 ...iE...w...A... 0080 - f2 2d be e2 26 26 5a 06-1f f3 c0 fe 6b f7 de ab .-..&&Z.....k... 0090 - ab 04 f8 74 e5 b3 c9 25-c6 24 ba 88 44 50 3b 57 ...t...%.$..DP;W Start Time: 1470992045 Timeout : 300 (sec) Verify return code: 0 (ok) --- 220 smtp2h.mail.yandex.net ESMTP (Want to use Yandex.Mail for your domain? Visit http://pdd.yandex.ru)
      
      





さて、出力からの証明書が後で必要になります。



実装



まず、Oracleウォレットを作成します。そこに、信頼できるメールサーバー証明書を格納します。 証明書はここで取得できます









ovmコマンドを使用してOracle Wallet Managerを起動し、新しいウォレットを作成/パスワードを設定します。









信頼できる証明書をインポートします。Operations> Import Trusted Certificate。









保存します。デフォルトでは、ウォレットは$ORACLE_HOME/owm/wallets/oracle/



保存されます。 次に、UTL_SMTPパッケージを実行する権限を付与する必要があります。



 GRANT EXECUTE on UTL_SMTP to SMTP_USER;
      
      





ACLを作成し、接続する権利を付与します。



 begin DBMS_NETWORK_ACL_ADMIN.CREATE_ACL ( acl => 'smtp_acl.xml', principal => 'SMTP_USER', is_grant => TRUE, privilege => 'connect', ); end; /
      
      





Yandex SMTPにアクセスするには:



 begin DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL ( acl => 'smtp_acl.xml', host => 'smtp.yandex.ru', lower_port => 1, upper_port => 1024 ); end; /
      
      





ウォレットを使用するには:



 begin DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE ( acl => 'smtp_acl.xml', principal => 'SMTP_USER', is_grant => TRUE, privilege => 'use-client-certificates' ); end; /
      
      





ウォレットへのパスを設定します。



 begin DBMS_NETWORK_ACL_ADMIN.ASSIGN_WALLET_ACL ( acl => 'smtp_acl.xml', wallet_path => 'file:/oracle_home/owm/wallets/oracle/' ); end; /
      
      





また、base64のメールボックス(ユーザー名、パスワード)にアクセスするために資格情報を変換する必要があります。



 select UTL_RAW.cast_to_varchar2 ( UTL_ENCODE.base64_encode (UTL_RAW.cast_to_raw ('user@yandex.ru'))) as username, UTL_RAW.cast_to_varchar2 ( UTL_ENCODE.base64_encode (UTL_RAW.cast_to_raw ('password'))) as password from dual;
      
      





結果のハッシュは、SMTP認証に使用されます。



テスト中!



 DECLARE c utl_smtp.connection; l_mailhost VARCHAR2 (64) := 'smtp.yandex.ru'; l_from VARCHAR2 (64) := 'user@yandex.ru'; l_to VARCHAR2 (64) := 'user@gmail.com'; l_subject VARCHAR2 (64) := 'utl_smtp test'; crlf varchar2(2) := UTL_TCP.CRLF; BEGIN c := utl_smtp.open_connection( host => l_mailhost, port => 465, wallet_path => 'file:/oracle_home/owm/wallets/oracle/', wallet_password => 'password', secure_connection_before_smtp => FALSE); UTL_SMTP.STARTTLS(c); UTL_SMTP.EHLO(c, 'oracle'); utl_smtp.command( c, 'AUTH LOGIN'); utl_smtp.command( c, '  '); utl_smtp.command( c, '  '); UTL_SMTP.mail (c, l_from); UTL_SMTP.rcpt (c, l_to); UTL_SMTP.open_data (c); UTL_SMTP.write_data (c, 'Date: ' || TO_CHAR (SYSDATE, 'DD-MON-YYYY HH24:MI:SS') || crlf); UTL_SMTP.write_data (c, 'From: ' || l_from || crlf); UTL_SMTP.write_data (c, 'Subject: ' || l_subject || crlf); UTL_SMTP.write_data (c, 'To: ' || l_to || crlf); UTL_SMTP.write_data (c, 'message test' || crlf); UTL_SMTP.close_data (c); UTL_SMTP.quit (c); END; / PL/SQL procedure successfully completed.
      
      





メッセージはgmail.comに正常に配信されました。 ポイント4.cが実装されます。



ご清聴ありがとうございました!



All Articles