├── .github ├── FUNDING.yml └── workflows │ └── autorun.yml ├── .gitignore ├── CNAME ├── LICENSE ├── README.md ├── cache ├── .keep ├── 360.dat ├── AnQuanKe.dat ├── CNNVD.dat ├── CNVD.dat ├── Cert 360.dat ├── NVD.dat ├── Nsfocus.dat ├── QiAnXin.dat ├── RedQueen.dat ├── Tenable (Nessus).dat └── vas.dat ├── config └── settings.yml ├── data ├── .empty └── cves.db ├── docs ├── css │ └── page.css ├── imgs │ ├── github.png │ ├── new.gif │ └── wechat.png └── index.html ├── imgs ├── email.png ├── secrets.png ├── sponsor.jpg └── wechat.png ├── logs └── .keep ├── main.py ├── recv ├── mail.dat └── qq_group.dat ├── requirements.txt ├── script ├── cves-create.sql └── cves-rollback.sql ├── src ├── bean │ ├── cve_info.py │ └── t_cves.py ├── config.py ├── crawler │ ├── _base_crawler.py │ ├── anquanke.py │ ├── cert360.py │ ├── cnnvd.py │ ├── cnvd.py │ ├── nsfocus.py │ ├── nvd.py │ ├── qianxin.py │ ├── redqueen.py │ ├── tenable.py │ └── vas.py ├── dao │ ├── _base.py │ └── t_cves.py ├── notice │ ├── mail.py │ ├── page.py │ ├── qq.py │ └── wechat.py └── utils │ └── _git.py └── tpl ├── html.tpl ├── row.tpl └── table.tpl /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: lyy289065406 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: exppoc 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | custom: [ 'https://lyy289065406.github.io/sponsor/' ] 14 | -------------------------------------------------------------------------------- /.github/workflows/autorun.yml: -------------------------------------------------------------------------------- 1 | name: Automatically crawl CVEs 2 | on: 3 | pull_request: 4 | branches: 5 | - master 6 | workflow_dispatch: 7 | branches: 8 | - master 9 | schedule: 10 | - cron: '0 0/3 * * *' 11 | 12 | 13 | jobs: 14 | build-and-deploy: 15 | runs-on: ubuntu-latest 16 | # 当仓库隶属组织时,赋予流水线“写权限”以便提交变更 17 | permissions: 18 | contents: write 19 | 20 | steps: 21 | - name: Check out repo 22 | uses: actions/checkout@v2 23 | 24 | - name: Set up Python 25 | uses: actions/setup-python@v2 26 | with: 27 | python-version: 3.8 28 | - uses: actions/cache@v3 29 | name: Configure pip caching 30 | with: 31 | path: ~/.cache/pip 32 | key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} 33 | restore-keys: | 34 | ${{ runner.os }}-pip- 35 | 36 | - name: Install Python dependencies 37 | run: | 38 | python -m pip install -r requirements.txt 39 | 40 | - name: Crawl CVEs 41 | run: |- 42 | python main.py -g "${{ secrets.CRAWL_PWD }}" 43 | 44 | # 若该时间段没有 CVE, 则 file://cache/mail.dat 文件不会生成,此时不会发送邮件 45 | # - name: Send mail 46 | # if: ${{ secrets.CRAWL_PWD != '' && github.event_name != 'pull_request' }} 47 | # uses: lyy289065406/action-send-mail@master 48 | # with: 49 | # server_address: ${{ secrets.MAIL_SMTP }} 50 | # server_port: 465 51 | # username: ${{ secrets.MAIL_USER }} 52 | # password: ${{ secrets.MAIL_PASS }} 53 | # from: ${{ secrets.MAIL_USER }} 54 | # to: file://cache/mail_recvs.dat 55 | # body: file://cache/mail_content.dat 56 | # content_type: text/html 57 | # subject: 威胁情报播报 58 | 59 | # 如果不希望污染 commit 记录,user.email 和 user.name 随便填即可 60 | # Github Runner 是有权限提交到仓库的,只要 user 不是 owner ,当次 commit 不会被记录 61 | - name: Commit and push Github page (if changed) 62 | if: ${{ github.event_name != 'pull_request' }} 63 | run: |- 64 | git diff 65 | git config --global user.email "github-bot@example.com" 66 | git config --global user.name "Github-Bot" 67 | git add -A 68 | git commit -m "Updated by Github Bot" || exit 0 69 | git push origin master 70 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | **logs/* 2 | *.log 3 | *.py[cod] 4 | *$py.class 5 | 6 | 7 | # 避免邮箱信息被提交到代码仓库 8 | recv/mail_*.dat 9 | cache/mail_*.dat 10 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | threat.aabyss.cn -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 渊龙Sec安全团队-威胁情报播报【魔改】 2 | 3 | **本项目公开在线地址:[https://threat.aabyss.cn/](https://threat.aabyss.cn/)** 4 | ------ 5 | 6 | 7 | ## 1# 项目介绍 8 | 9 | 因为之前看到过在线爬取并自动更新威胁情报的项目,但好多都已经不运营了,我们团队于是便想自己整一个,就有了本项目。 10 | 11 | 如果你觉得本项目对你有用,欢迎点个Star,感谢各位师傅的关注和支持~ 12 | 13 | **本项目公开在线地址:[https://threat.aabyss.cn/](https://threat.aabyss.cn/)** 14 | 15 | 从以下公开的威胁情报来源爬取并整合最新信息: 16 | 17 | - 360:https://cert.360.cn/warning 18 | - 奇安信:https://ti.qianxin.com/advisory/ 19 | - 红后:https://redqueen.tj-un.com/IntelHome.html 20 | - 绿盟:http://www.nsfocus.net/index.php 21 | - 斗象:https://vip.tophant.com/ 22 | - NVD:https://nvd.nist.gov/feeds/xml/cve/misc/nvd-rss-analyzed.xml 23 | - CNNVD:http://www.cnnvd.org.cn/web/vulnerability/querylist.tag 24 | - Tenable (Nessus):https://www.tenable.com/cve/feeds?sort=newest 25 | - ~~安全客:https://www.anquanke.com/vul~~ (该平台已经不做 CVE 分析了) 26 | - ~~CNVD:https://www.cnvd.org.cn/flaw/list~~ (该平台不断升级反爬机制,表示尊重) 27 | 28 |
29 | 关于 CVE 收录的完整性问题说明 30 |
31 | 32 | 33 | 本程序只收录国内外安全厂商已收录并分析的 CVE,并不收录所有 CVE,需要全量 CVE 的同学可自行去以下站点下载: 34 | 35 | - CVEs 官网: https://cve.mitre.org/ 36 | - GitHub(CVEs 实时同步): https://github.com/CVEProject/cvelist 37 | - CIRCL(CVEs 实时同步): https://cve.circl.lu/ 或 https://cve.circl.lu/api/browse 38 | - 每日 CVE: https://cassandra.cerias.purdue.edu/CVE_changes/today.html 39 | 40 |
41 | 42 | 爬取到的 CVE 情报会作如下处理: 43 | 44 | - 【页面播报】 最新的 TOP30 威胁情报会更新到 [Github Page](https://threat.aabyss.cn/) 45 | - 【情报归档】 所有威胁情报会归档到 [sqlite](data/cves.db) 46 | 47 | 48 | 49 | 50 | ## 2# 目录说明 51 | 52 | ``` 53 | threat-broadcast 54 | ├── README.md ............................... [项目说明] 55 | ├── main.py ................................. [程序运行入口] 56 | ├── cache ................................... [威胁情报缓存] 57 | ├── data 58 | │   └── cves.db ............................. [sqlite: 威胁情报归档] 59 | ├── docs .................................... [Github Page 威胁情报总览] 60 | ├── src ..................................... [项目源码] 61 | ├── script .................................. [数据库脚本] 62 | ├── tpl ..................................... [模板文件] 63 | ├── imgs .................................... [项目图片] 64 | └── logs .................................... [项目日志] 65 | ``` 66 | 67 | 68 | ## 3# 版权声明 69 | 70 | [![Copyright (C) EXP,2016](https://img.shields.io/badge/Copyright%20(C)-EXP%202016-blue.svg)](http://exp-blog.com) 71 | [![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) 72 | 73 | 本项目Fork并参考了 [Mr-xn/threat-broadcast](https://github.com/Mr-xn/threat-broadcast) 和 [EXP-Tools/threat-broadcast](https://github.com/EXP-Tools/threat-broadcast) ,由衷感谢这两个项目~ 74 | 75 | 76 | ## 4# 感谢各位师傅🙏 77 | 78 | ## Stargazers 79 | 80 | [![Stargazers repo roster for @Aabyss-Team/threat-broadcast](http://reporoster.com/stars/Aabyss-Team/threat-broadcast)](https://github.com/Aabyss-Team/threat-broadcast/stargazers) 81 | 82 | 83 | ## Forkers 84 | 85 | [![Forkers repo roster for @Aabyss-Team/threat-broadcast](http://reporoster.com/forks/Aabyss-Team/threat-broadcast)](https://github.com/Aabyss-Team/threat-broadcast/network/members) 86 | 87 | 88 | ## Star History 89 | 90 | [![Star History Chart](https://api.star-history.com/svg?repos=Aabyss-Team/threat-broadcast&type=Date)](https://star-history.com/#Aabyss-Team/threat-broadcast&Date) 91 | 92 | -------------------------------------------------------------------------------- /cache/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aabyss-Team/threat-broadcast/a5f6e85ff071ad3a2784ddd8471bfd5a48e7984c/cache/.keep -------------------------------------------------------------------------------- /cache/360.dat: -------------------------------------------------------------------------------- 1 | 60c8c45ed429cb61105e29fc40f9a0d1 2 | 72a8c351200d5b9d52ccf6fa2a6d37ac 3 | d0b648bdb3937ebdf73de4613775e4bd 4 | 60e29d369e19760d6a268a2f136af052 5 | 98f6dd6483c16fc06f63cea8013e27a8 6 | 80f5b4b1b335adcf7d772dc51324662c 7 | ea566f4a256a32e0004a0041b15b38bd 8 | 117bdc512c73d785968f0628c7b98ee2 9 | be75dc9d1d6ce60bb5327ec1202511e2 10 | 085f433db57548fbe5bfb887489607c3 11 | 3bb491591e248335f59f47a2f3d9c9a3 12 | 186fc2cd3a964247480d1c173a3a21f5 13 | cfd3a55cc52941d0e847a6464d22dc3a 14 | cb6cb6cd6b4d289c22a5e92412c6a0db 15 | fbbd5295559d5b3474e07efc61e43607 16 | 155737df6467759aeecb8fe38bd5a4f5 17 | 6be67a1b71d28f94509998f3579bd81e 18 | a9b75e840b22a77ac9268665961f5e90 19 | 2434c842c5244c59fd148e26dec2eb10 20 | dd79a45419ebf38b4f2f1ef9ed382a87 21 | b892187cfe416a1a5b663d4141200b0e 22 | e7e5d9fe2f6ac30cc5e8aa208460e130 23 | e63b54ad83120a945556a8748fd708b1 24 | eccac2d93880eec736a92a77b37279b2 25 | 0c41d530a4b2bb053d21b514bfb661a4 26 | fad493a0ca64bc52d8f429a602358566 27 | 6db0a94bf465c228c4bb528a2510eac2 28 | fa19ddb6b2dddf7e2e5a7b419ca8b761 29 | 811f648b4b1692cea85cd5a769a78f48 30 | 212f0c40e241733486c73f689c11be22 31 | f872114ca49c83ebf501eef6c9ef5953 32 | 05c9df87d7b15858cf233defec195456 33 | 9945a76bda5b7985a9f412a70acd5745 34 | f7382f26022ec3584b1026b90a1a9952 35 | 9d1679cd245c1c858b2b0a5ac7e225f9 36 | a5a2a5b74233b6ebb4ba1c719515b012 37 | e33858320ac011718f372951be2c7585 38 | 5f428049448cb9bef2134ec54426e769 39 | dd85ca13d1323d8ed02465810ee4a295 40 | 41ec5d8c1e6b95f4a3b3b88c0a11d7e7 41 | 96d81a7a674dae326770bc1a260a532b 42 | 4e3614c0917ffe593d32c4a65583dfb2 43 | 857d455a82d0b009f556adac09450739 44 | 7e91af05fae8df9fdff9df9a5cea4521 45 | fe960345ba225713536c24592a8dadcd 46 | 5846ca277eea2d24b4f882d05d91d585 47 | d8fc7b0a2d2ee666732fbb7deb57f381 48 | 22b00ab3c555a7abb9dd066ea6f200a2 49 | 5253dbc6aa92fee3b23f8bf8d1d1e2f3 50 | 6f23815c34b846ae29e22af61329d7d1 51 | eaeea639323d219e7c4cd8c42b9f3ce0 52 | 7af06f7ac96785fa95163ae17e62838f 53 | 60a53f663b3c7271f1c22ad1388ab272 54 | 3be3e23aebac9a3df21acd1c44d6bc5f 55 | c65bcfe607a5f17340822c2ae0aa4f8f 56 | f83b0e98c1469de86f2bcdc8518a320d 57 | d21de328e52d24af1dcfb48787f7f837 58 | d852930ab6de88f4a99cda74a4470942 59 | 6e246e43d1d5731b86ea80625ef6722b 60 | 2e3f0da483cd3001f9a85038df9f97d6 61 | c31a9fb43140e15fbe70a41259672c9d 62 | dab9e3dfa1c238b16d891a9618216e18 63 | 7da459ea4f682ba75638d74680c0b09e 64 | 01e6ed6266e9cce57c5fd60f86273a0f 65 | 6e5423390c37684983ec7093a46ad5c1 66 | 2de1468a906c61f176a02c9726b908a7 67 | d54a16ae215625ace0bd457fd39bc8e3 68 | c7a5c1459334c55697a6a5a890dfc36e 69 | 1e48519fdd5097506f01324727faf801 70 | 64e4df7aa6e3ec9230bba76ea075a292 71 | 9a5d725b6a7a37922dfa39f85e5c7c84 72 | c1c8a490ddfdcd1cea932d3b94d631c4 73 | a01eb187043eb4ab5062148c4a0b909c 74 | 460c74892d9e5608c0b4a1857318912d 75 | f605613725d0295cc595f5f8f8b93778 76 | fd4c1fbdd4db6656a638b080fc6ec2c8 77 | ce96250e801142bf7a1a33bace56f00b 78 | d7375fad6d35051c69ec9f6d7a593d43 79 | cd1116ba61d7621658344af832a50378 80 | 1d4726001631f00495aa6f712761f619 81 | 9be6644a01afde5381a5a3a4893b5b81 82 | 645763f6a0eedba01accb4995725bd5a 83 | da4781b42913a6736722eead229ffa38 84 | e75717794cdd615ee86c74dc793abacf 85 | 9f47371ca300d0beed2a2cad8247fae4 86 | 0a88c91dd4a6a04a4688e8e615f2318b 87 | bc5bd7b8b722f4ebaf2a5079e1b0f9eb 88 | d2f09b7b683a372c741d7aa39ccefc48 89 | 37cabe205769a70b3ad760ea082b5f31 90 | 476cd1ae99828ba3fd94bf4420be3326 91 | d206392ce2daf66f9afc767ac614a70d 92 | 98524aa07f98e90e7c75f55498b85223 93 | 4401c8bb46968a9cb6862ffdb5be2e6c 94 | 86cdb032d3a57da3e003b9e6e6ff9ffd 95 | f18cb797c7625ca60bcfc9e81f43e11b 96 | dac3d4c11d219a855e7f4187f5b2f0d0 97 | c17f1be9450d62816e9bd4313064b29e 98 | 1634b39b7fd489d0460118d3d79c60ae 99 | 455008d992fb43b5ec15aabc67b213d1 100 | 5e5e99dec127cf5ef34b7c06b69a4f97 101 | a9b011231528ca47c699aa1294587e58 102 | 02b63a6f6f4aef29272cce91f25188f4 103 | 5375fa1a58656f65f5e15e61fe7c1eed 104 | f99b441e73a47e3598e272bd64f921ed 105 | 942f37dd434aa219a6bf360ecd824657 106 | d9d374f5f0f71a5ee1a4bf21eb2f78f2 107 | 0b05db858f654aa34fc3cad45ba835e6 108 | 9da09d62f0a5b28793625ae0bd08ddc9 109 | 1232121fb0dc9a4f91035de166c36df2 110 | df02e4e501c8ea169f5af6262693b386 111 | 564dd0f3b2f4359073c8f957e318ba41 112 | 291e6d636fa256e4a58d5e61f3ebf052 113 | b832908677ac995371f5920e7cc5d26e 114 | 1c2e3c675e758ff19e9e7a7b925fdc32 115 | f29909ba5c28b590bc5468cd803c1d1e 116 | 212659fb014c1f821cd0cdb71492648b 117 | c1469d680d107bebc1a1c1335c67a173 118 | 65c3b12a3e99e05e29189b35ce8f7a42 119 | 07456473e3811380a8d58cb6db544dc3 120 | b57ed8f1361f17b17854ec37132ab06b 121 | 2e587b62c57e6e1ab8c5f7b6ef9431d3 122 | 2470981924f70d63615fb68cf5f23f0f 123 | 0f285a242ae61360c68de6552f8c84a4 124 | 8221c5e2bcc240d78cf96f2a7264f390 125 | 2f569f20baaa2a22b0502977e2efb4d8 126 | 025f6cdfaa83f4832823013e90996614 127 | 9f5ce00c599f45bd0a49e5316b83baeb 128 | 9f0d91c02ce3e1145e95b57eec33f317 129 | 3759a4616370fa41d72a52b46aa05eed 130 | f465b5a7c1c84e1ccf1f5711db06b154 131 | 69fe9dcd4b8e00f29aca906057e40c4d 132 | eb6a0b1b9fcae05324ff90aa7e48cbd7 133 | 96984e4f8f66f40bcce09a67fc047e6a 134 | 91ad469bb609ec23704dbb967fdac0a2 135 | 87092253032ae5b75f0fc3147166a56f 136 | 9f2c97b9aba05ab25f5f971cf4262b01 137 | d338f27dce5a0199e6749cee216ecc1d 138 | f939e755f82442ebe80572db588b7507 139 | e7df2eb3685f99187f31ad14b3576faa 140 | eaa6acf0def8403478f01611bbbb1fc3 141 | 06e51932eaaf8616e2fabcec2df35357 142 | f5a696fc670504a00548e6e60fab7169 143 | b9eee8da96dff54a03ba457830517896 144 | b04ec10b173cdc33886a07ddee6726e4 145 | dc45fc2f83ee72c52336d0d989df42c6 146 | 23a5a963898c6dd215cb832192aab4a1 147 | 0de8ea93fef9e1af172dffe5ed47805c 148 | 6cff5f15cb2eb60eba5ef54a95c670f0 149 | 5183a2d97c1cd492f43b038b9f59194c 150 | f92630b3a50e7b5a78379d86c0fcbe53 151 | 8426cf2d9cbe17e20d7735d333c4444e 152 | 36234236bfc0bb04641ac34739c61148 153 | 5657eeba6de6a221b26cf909287213b0 154 | cfbfdc8b98e7ced0f0f4d57206b0bebf 155 | de7234848d6c9c6c9426330623f21e64 156 | 57360c4008a039219f8d72c65c41dc1d 157 | 76424980d60f4e053fa23fff0655df53 158 | 15cce4a20e46bc52528d26ca6e5c754a 159 | f9b2d7e67dd4864becb5ca667af6fba5 160 | 1afe2cca2ae39e340a5dd11085d9f654 161 | 355ed7f85b429d7b3bfa64f139714a82 162 | 5ca15d1ad2636569eb8db2790ea6958b 163 | b9e6bb0b694e5a6b23617b7edc7027e6 164 | ff3d7960300a8d0b3140985acab3453f 165 | 833aa211b484ddc82b5f56b106cee709 166 | fe8f4a3faf60e0872c98e873df183565 167 | 53edc8134dc7b9c8ec879918d3f3ac34 168 | 0301c508955f052cc6189f3e4eba024c 169 | 6e48405678fb5434797f7c0ed5bdf347 170 | c5dd4284a3c876323e411f9358a8401a 171 | 3442ad3a66587ad6491dd0c88b6d3c41 172 | 329d1c59f554b2b096a69a97f8fa6930 173 | 5772b08391d168f6b720a19e750494f0 174 | 54a361d657362139a4d0c0cbf153d052 175 | 417c12dc2092d637acc3a3471845c855 176 | ed612af34543e280880d4c3014234a3c 177 | 66dfbadfaf1a21e532c50e19948a2668 178 | 8a3e0fae26125c451874d1f87b6f7b67 179 | 8d5c0347d712c60b3be2069cb5e3e333 180 | 52aa6ef6e8c74b9acdfca44dee165e2b 181 | cc797471d65a70bb275239b0bf6d889a 182 | dfba4463b07c7a5f255c3e259e2c4a0e 183 | eaf0fd0060eb599b811359c897e8500a 184 | a93ee16bf37c73fbd8f58e77f072b37f 185 | -------------------------------------------------------------------------------- /cache/AnQuanKe.dat: -------------------------------------------------------------------------------- 1 | 4d67c0e80aed85002c42f38bcd291035 2 | 98e1fa40d3ed2ae6dfa5e6c697c23384 3 | f973c222a5287e46ae5fd80c60b6e2fe 4 | 01554aa04b25307760fac14fd9e0b5c1 5 | 41bda5b23f12e7963b91fcd8a9bddff2 6 | eacdf710fd3efc4404cc00d0a8a17dd5 7 | 36c7b4761011846dc501576225bf626a 8 | 1e9af3561071309b740d93b7a0da5854 9 | b6ef1916175f2fe4dac25aee11fe364e 10 | 62fa1b163d8db2fffcbcc280ac8fc2ca 11 | 32951fab94e5c659ee3ef0e75b7697fc 12 | ddfda5c90c73e4dd55dfdbb947e6d99e 13 | c4d27f453f0e4d2a235d939368dfbf36 14 | 8ba51382627e7ea73799fb423ccebc5a 15 | 41365f389a11f1e0bd9c1527cee3feaf 16 | 721f2664d129e1b1ae6803790cc21fc4 17 | a19c0a8ddc8aa07c9e9a7bf10e0d133e 18 | cb081e8bfe7a3ade13caf6b9081fdb03 19 | 9fb3dcab6636b4d6bf2f353aa8cf12a6 20 | 1eae0d01afef119eb8e621556b7c5863 21 | 1a8db3a23b69aa6d07376e5e8fe6b14d 22 | 415a72f524e05219848fcfebe24d5ed2 23 | 081a1989d55e4b1aa08447ede68e6ec1 24 | a9d9605c2f6e48fb93097e749eae503d 25 | 904f37515b0539f4e1d62cb63163478a 26 | d81f858b2dab21e4b7a1722b7e5fd4b2 27 | 398e0aa0784464374f9b756debb25800 28 | c54b86bd0794a6cbfb3275da3abf328d 29 | a81df539e4db72de99a447243e314218 30 | aa62f4d29ab00e666cb70ef6ebe09264 31 | 3c27145f787f8b15a9e4fd890c379670 32 | 0cb98fa498b36d9c6622b4d6982325cc 33 | 2d32e89b0df3be01a2b3a17bbb250145 34 | 4e49fa1a1dcdc825d166639a5f2f3527 35 | c0ca0c9c7867160a721d7cf33cd2a435 36 | 9bfc1709ef5dba45e18d034528344870 37 | 352bd1b44aabb13c2cb65b7733f42eb0 38 | cae85a46fd79e35ba69a0de3227d8390 39 | 6117158135d5bae4a774e05577a06798 40 | 09108c43713a09416fc5847a19c0d6f1 41 | 649ed27012c81f04c6009e7436db4b51 42 | 9a65be8a9dd4e05708396b2778b5d416 43 | 99b5354302a6b74949196ff2e1e101fd 44 | d76170cfda31c563c61c7a48e0310742 45 | 9420f40a6c7b4601cead330708ddc55b 46 | 6c7c67f9762137ad19c2b25f17cb4693 47 | 931ec9139e518bf8a8aa74b14ebb6bec 48 | b62b49a020af146ec1dcf38497d612e7 49 | 61195ff3b7453b154805a7d2be39a172 50 | b65e0afacd884322496d5da191dbe32a 51 | 12cb521a48f2109d1c3cefd4067324d5 52 | 73e1d6d705fa4a7b07244788dd926c0d 53 | c1f7d9d3e3d72c6aafadd1f6e9fab072 54 | 861a69dfb93379a9896122fba0814d0e 55 | 3e61b481a81e25cb85d610602b7e82e3 56 | cad582657355d857b5e6e2b60c5a3456 57 | eb671862b60e42a136b29a1cce92d52e 58 | 24ed7bbc25366eda4192fc0cff81138f 59 | 686b9e7483f7edd9af83c20c4f5efb11 60 | fa6e3b093c0f8e07c5172477f6a4002e 61 | 3f9fcda4050e8355408db32c0100355e 62 | 5b846483a3629a7442440437b4b8d821 63 | 2a27a8a8e5b4df1973d4636801d508f6 64 | 680a4218fc32922746717210664a3d62 65 | 373930f669f2c1f7b61101a925304779 66 | 8556f9cd0699f88c1f6cca9a43463bdd 67 | 480ae713cc88cc0985e1ebc079974d83 68 | 8ef4dbefa6604ea2312621401c3ec0b9 69 | d6e8714c32df7a0dcc2f3910ec68b42d 70 | 4e60b22611b8bb0fd7e532896498af29 71 | 5ca48ad58fb499c069ae0800c3b39875 72 | 2ed854890b43f08e52340a1e8fe6d39f 73 | 8d63110e1475bbd245715b2ee1824d13 74 | 72bef2ae2f5db7dd066e1cdefa618dc5 75 | 1f7369b2609dbd2cd40d091f7de540cd 76 | 1793176eecc5813c3348f026dc9909c9 77 | 7f4cf34ceb545548dcfcc3c0e7120268 78 | 58553eb00d6e3e83b633f09464c4e98a 79 | d8e27ec42fb0b89998fcc006f49b249b 80 | 8f2adc6c247725bf2eb7f53256c93ea7 81 | 8f949676124339eb6f64f9c607af5470 82 | 069818a8958f9c158fcb0956ee32fc03 83 | 55b9126220b9722ff5d730d3996877e9 84 | ebab009fffdee3d360dcdff74b0ed061 85 | b47f69da3fc7fc3b287af789597444cb 86 | ff0886b8ac24cda5fbc1edb16cf9eb9a 87 | 8ce284ec62a188d2a9eefc29f3cfa870 88 | d4824851a66baeedf30e19d3305a5da8 89 | cdb9cada071359cd265160c82b1f991e 90 | da2d3b3533b0fdeda5f634a4a2c37449 91 | 2edb58a43c3765afb83463b3c63047e6 92 | edf952f99f7d9b13f62f9c24246d8762 93 | fda6fb47ce06e5e1aa3f7a159deb1c09 94 | 85a2b467d1ce9d16a56459a7c13af71d 95 | 715fc87ed81b7296357b0e6f1ea317d7 96 | 2160e1eb2249387b01a31ab15cff482c 97 | 7728548c7063485e249b284def7f033e 98 | 4eb17ad7e012ea18006c6c44d14fcd25 99 | 2574d07c28a6cff29d2ef28ffc9e259a 100 | 3624354c0a80419647908e5f216e5b7d 101 | 0805a3d697b221e69b7569f996967d0d 102 | beb406b85e65c54096b2f04e7231f13a 103 | 0825806a689a3ff2e04c777f87e0870b 104 | 92fe450ae5c5dfa48072aca79d64ba63 105 | d4f12de949590ab346b61986a29d8b4d 106 | f790e7ef3b5de3774d42ee32b9b10c01 107 | 71bf261eb2113d5ff870ab9bafd29f55 108 | 152793cbc104933584f5f227606f433d 109 | 75f153c327984fdfdd2d9c463a91371d 110 | 9610336f1a41241cc8edea22a2780ec5 111 | 03afa8b4eaf4a0160784152fca5465b2 112 | 8b0ace4c54a7fc20a99d21e294152a99 113 | fcd3424276984dd4ca94fc65dc4d3f71 114 | -------------------------------------------------------------------------------- /cache/CNNVD.dat: -------------------------------------------------------------------------------- 1 | 30979cc9071de8dc79dc86ab825ff1bd 2 | 350052013f5215f231e44fd846e7e2a2 3 | 34e6f17abf2eb88e2133953d33ba6aa5 4 | 675b806514b675242ee4cea4e4d7860e 5 | 87a0d09aae4195d15b9178cf3620effc 6 | 1f0c268655c2ada5b7512a280b0505a2 7 | 6e67804b7791823fad3cbaf7da54bec2 8 | 585f9fa4cffae4bc1671552e0a837646 9 | 89fb72e3ed113c50adbba4766e643b69 10 | 6f7fe410d3aa6a4948ed41eb8f5d71f4 11 | a94bcecefa4bcbdc38f731a866ac0c7c 12 | 3406a679cbb284ed607e13b94c19bfea 13 | 992b932aa52280f05fec299df439d4d1 14 | 9e773bcc573e42dad8b9976c4a90b389 15 | d4905ca53b656c7443fd3edb8475250a 16 | 46b15565a524762530d721d8903ec72f 17 | cc7b79649d8da93450bb6fdcb624783b 18 | c3b4149d7b1055bc99fbf3a3ef915726 19 | 5f181acb22bf425e9b5a2a24f657b3b5 20 | 983048af921872ef898791c9973f1716 21 | 4ed65bdfc42934100f13fd73e7cbd1be 22 | b064cdba1c5a03cce86142b0e527ef8d 23 | a751b528645a191f681d57a2ba00f37c 24 | 58d330c57ae47541651384c510ca9c09 25 | df963de91baad7b629483d3767d5f9a4 26 | 90622944429a9aa142cb99d59a3da226 27 | 58b22d27daf1b10691d151f559f7a680 28 | 08a190aacc3774bc8ebfd8661c478535 29 | fc74d32b41845978b2cbb2f5ba885529 30 | ed6a22a2cfcc7c1bc3e72e792c280f71 31 | 5674f66140383b3e50b5b2db4d77e6d4 32 | efb50b3ae5549c44a6d607842897204c 33 | c3c36988296094ac182c0803c0165577 34 | d2c5349d902650b56b7249ed92abc33c 35 | b7fe7ef9bf4f1c9b5c112bb4b376bb0d 36 | d8ced06c4f9c0769c7a4a144ed3115aa 37 | ae245d245035c3a0b59128b57c495ad8 38 | 1b4513500943ce56c06ac8b4cbda1385 39 | 31246b87d7e91de3cb024b4978cae34a 40 | 4f69c29eb929598b5d429091eeebb2f8 41 | ba3c06f28735736d6a0a23b5cb9d6b4d 42 | 972104562a4133b9bd7efa980bfc6b28 43 | 65debda48642b987bdc631aaa91b4152 44 | 86289e6d1f74b0d4ca6b9f99036c79bd 45 | f7ee032235ce8a70c67bb917f17cc062 46 | e80fb52e5314bc0b4fac0d71365d1899 47 | dcc8fa8718a0cbae4ed8da15366ad427 48 | b1810fc16cb739b96489c97cb511f5a2 49 | c3dd9a9db1a37e49581ea7ec2fd882e6 50 | 140bf0a59a17f0053019594c9922db69 51 | 930676105ef77b2e989b0f0f1d7c17f0 52 | 30c0f11d72c06050d3aacadae3f3a5e6 53 | 41fa39dfb4660ce39aca6d2d0ebc3446 54 | 5aaef814d7abe0531ab56a4b210ba037 55 | d153952298e022131f2fc9a553edaa0d 56 | 43d4d6cf00857c07f7eb7bd2176861df 57 | b87fffdc7c35a8c14e4fc968b1b755da 58 | e58a6fb6d3649a2b7921e835c37eaf48 59 | 8499893939bb336e87e27a53dbbb3d41 60 | a0a167d82a995927b2df726f82320c85 61 | a8949d9fdf13b936c6cd571c66fc151a 62 | 7f2f55a4abb44b34a32efe2eb88a43bd 63 | c8926e5cba6e67e9e2bffdfb483b2d3c 64 | 2f88052104db9049548c10e5cae2fa52 65 | 5095924c7b8574a6d1f1994583a2a060 66 | 7329f8607d0e4e4a876f47c02b042617 67 | 60a1a7c7e393604e79a6368c49a563ae 68 | 4724b1e3be34aca22a9d40182a5d2368 69 | 6c7187f8ade1b85f774f3cf99cc2007c 70 | 2e0f62918e232c26b18ab18e801d9928 71 | 3e9a186857af58add9d16f0a3bf3d699 72 | 44a08506e1e39ed7a866b68f9aec8b98 73 | 05caf2e95b7a0f72e0c071c443e1d82b 74 | a09d1da1d10d2b5f823d7b8b41490660 75 | b61f0e730dfb90bb1c6f8f6e83508ae7 76 | 67539644d8b06577c03aeab1ac018450 77 | f995ebc4f6961ed50c6d18ec0f7efcf4 78 | 775849c6f8c5fe41588806137e12cfa8 79 | c81e50233ec479272b638b8dbddedeea 80 | 91dcd4420b85064dbae045bceabb71b9 81 | 10f462bbd81ee431ab32c6a160fc068d 82 | 73ffd9540daad0a04d3d54041ba9df14 83 | 8b0e98f117732e813318bdec77d0fb4b 84 | d70ae2187ae1aa50a2af6befce15bfbd 85 | a4340da9d26800c671fa800a080c3d01 86 | 55409ee74ffe87168f7d61814b568334 87 | a6be4479387eddda68e1c7808965c1bc 88 | b790441bc923d37c914ea50edcdfaa16 89 | 915090fa2939ee9d9978125be4eeff27 90 | bc6915cfb72ce7e27f2aa64ff3a35ee2 91 | 086c171bc44677f87e0ad45c8ab5dab6 92 | 6a73381eaa628503bd8c242cd313f005 93 | 8d98bb094a70919c9e881cc7da5898d4 94 | b5815af17792cf5abac5732bae3094e9 95 | 619ce483843859fb783525b2b8d00f59 96 | 0e8e3c3600e145e70920c2026bde8feb 97 | a3b636c53a2116b7ab85ea0c29470e76 98 | 72d862f454eb3d0e4dd221413d85f6b2 99 | 224fd467b813dbee234efe1e61e2ec66 100 | ac7b17414d163c2f26008516638e3a99 101 | 452c53b54ef3a658eaf6bd8e7d93fe05 102 | c65e18d821cb73d6036dc2df6a726951 103 | -------------------------------------------------------------------------------- /cache/CNVD.dat: -------------------------------------------------------------------------------- 1 | def0fa48b6b369490a1b582478dac9c1 2 | 994c3e767b59777ff518cbb14b755b47 3 | def3f1cc148d22c8c91ea2ab915fc972 4 | 0ca0b6bcc471aeb3e8e5d1cce576dca4 5 | 064cdf165344ad013e7aafe8e581bec0 6 | 7c5c848d9d6c7a3ff80b9cac37a123cc 7 | 3c1aa8ef7b9ed7e6b4159c2d3494023d 8 | 0b777e6a6477d7196d380629d4c5299a 9 | 44fe51cf8608dfe8dfdc30280a2b1b69 10 | 2cc9dc76dc98f06ba835fc0cf4531d71 11 | 72161d049409b4cd3aa49918cb381d35 12 | d9c6b3a42d1c96d1c1bb6f82ff407921 13 | 1a7a5e700c32df1bb3fe772efbc49b2b 14 | da4bdf61d521d955abe7e251f5246b75 15 | 5e799e1ec81a767ede6a16de090897fb 16 | abc7cd069a54659e36beb50d96fa810c 17 | ea5cfa970dcb0d070fc2ab357e31e246 18 | 63ad76d3772e424e3739f91b16ed32e7 19 | 55a35ee8b7f919d40e62f172488d4029 20 | 3ce0b60ac771ff5cdb17ef502d43e773 21 | 5df4b15a4b270c769cf0f1a8deb58f58 22 | 96c1baedee89c9bcb66fc2a1f902adbb 23 | dc995682533c2014122f5cb664a6b0db 24 | 5512c987f2680137802565b4f5354ead 25 | 28dcdb3417eb1f1dbe6ef9a78da3dc9a 26 | 5aeaf328ffed0eee02e4185d7c4ae3cf 27 | 4765f8f3e828a3e94e81724d7a7f8b63 28 | e742de339cadc059b849e8437cdec88f 29 | 2378187532b284e0c7f10517d0303bc1 30 | ecf49dc7dbae438093c40cbf09ba1160 31 | 5e57542cfb8365056e6fb987b51cbae0 32 | 1a57581ef524df42e3af57eff5c9a029 33 | 514b1e363b8758471236f97253090a3f 34 | ace147b5efe0bdb56c8aee24e7cb7594 35 | 28a7f4fcd8b85b14521e4392a5135ea4 36 | 684be72250e045877e8ec0314005faec 37 | 5411f3398c7ab5a95072751b63da38dd 38 | dffcc5e5fa69105022c31bd90f437d24 39 | 63a99ffa42fc98c19d14cbf26b2d801f 40 | 38f31b179df155bdea17cf6e81488476 41 | 3b968aa924394569347dc6eda9466646 42 | 08039818bc0a202bb0913928968e71d4 43 | c3f0ff1f38921cfe0b5aa51e804d97f5 44 | 8b6dc1eaa89c6b404427b359bb14157d 45 | 2eccf7d61804f874652e74067d15b6a4 46 | 77baac976cfc718f967338699ccff9e7 47 | 6e1a3c3a912ada3719bb9083ed29aadc 48 | 40208e3ae36e3c3614e033d659eec7bc 49 | 3cb7e895bb4da5ea705a88b28425836e 50 | 5c6037c85bd6cb5c8f5f3bd57f057e0b 51 | 959be4b0dc2debbace010f50c65cbea6 52 | aed38a23f2c383a3037e1d577aff8f16 53 | e3ce2ddbc3375d0d430ee916d901dae0 54 | 62fd613345b94cacd8b603dfcfe16917 55 | 805dcfe26eaec8f3bfba7b5c6acaed6b 56 | d0eb197ade3f7b4dc2008e0f06877ac6 57 | 5e286ece6817faf0c2ab6bf5bdcd7e5a 58 | 160e6e215b2b174c71a8309c04f754f1 59 | ea7113c75e04b4f58cc8f7e2c0f7feeb 60 | 5f8acb0d913511e030b065f083a039f5 61 | 088b596dbfea1df39110b3f28c82b227 62 | 7965c74163a7eca11c17d7908026db09 63 | 4f92856f76e3807567219e74b25e5dc8 64 | d3593f3e2305a3cac27b33b8d671c6ee 65 | 9afd2b027fb6484a1710cfdf2b4ab447 66 | fa7f7dc384f29f71ab8fe4835712105f 67 | dbbc79d701b5bca942622d350fcba670 68 | 759756270b631c4ca58738c30ffaef47 69 | 7d0acf8804f6df4922777f1633bb0ce0 70 | 7d00952f14bacb9e7c17494daf800e7b 71 | 4638d2dd484d3375ae4f0b2f47369e74 72 | a8b0b5364e39dd769cf0c0e21319f02b 73 | d2bef639a0b6182006b1e387d1ca11e6 74 | 1c8606fbdb09b5b3ee9939d5a0c2442a 75 | abe5acd057af1485169c66f4800a7891 76 | bf3145b80ca8125ff87ba28bd7a270de 77 | 37b330c243db2669d522eb193b047765 78 | 1ad87d283d13189428dd00f9515e1828 79 | 469eda7e930ec9f97e56917ac82f5fc5 80 | 218f8bfd8eb7b9e5041aae9105bf017d 81 | 23c35cb6f576c184bde0203d4bbbf80f 82 | 3cd372f4c4844378a2f98a6bf10f7c10 83 | 518c249f9f341bde7f5fc0393ddca004 84 | 5a35aa429cf7eeb0c493626530881a5d 85 | 17eb3d5b84ff47efd19fb804902d978f 86 | 978dd9435257bf302c71a76088c12eb1 87 | 3bfa10598f980d26fc0894385a65b881 88 | 74674adb9be3136b245eb8c368495506 89 | 198033ffdae1a4df88078da6e1d215a2 90 | a7a9d335321e79cb79376a5e9d1aa722 91 | 6b473621a0a863675b7b920e73064262 92 | 51382f866e18f56e4dd01a691d6fd77e 93 | a5e1a2937d386c1a4f093e604b5a415c 94 | d83e6c20974822953fcac05d2ed6a5e5 95 | 50bb8f7ca4a665164257cf76938f4376 96 | 99f09e8de070354996792a55243310ea 97 | afab4302f7c0b0b0fb9f2cc90ab28af0 98 | 2c491f73f9f7d7e831bf2f0052d315bf 99 | 26292bac9eff5e1962a0bb7b182ecda6 100 | 7090666b8552e0f66933b33627ae6e87 101 | 3398ed455a3a599a527222adefa09f6c 102 | aff0d467e0224852e8cf9ccad156adaf 103 | 4af670ec71281cfff4b929af0f1c50ef 104 | 31e2af83c7383046953c9bf8e918398c 105 | ce82563aa5efef5d99354ed77b04c24b 106 | b3230aa90466bfaa035c9c0e4a47e8e2 107 | 9f9a477a7dccf4af4e475e01e3471b17 108 | 58effc59d08b8eb9123c4927188fd303 109 | 3b50cc300ec12764fb7f3acd71e6e008 110 | 59be4fdd5d41f14bafd1af2750eb8adf 111 | f7ccecffab33a9741c4a07a671cba43c 112 | bc6d7ab01eeff342e842ce34485d9418 113 | 888d2b99c44c27a5c01f71aa68abc9e8 114 | c468db4399527671d570c3f01519b080 115 | bef4cf0160da2cd7af257574bb9f4ed6 116 | 455b820edd08ac53d158c329a7173df7 117 | 584bb6b08128e2494ac6ba27fb171f11 118 | 6ef5fe1c4825967417630daaf8804145 119 | 264d82d3ce9b6887ed455ee46cb6813f 120 | 5d22397a7f54415d400f15a9cb15e90a 121 | 971f7d179558b1074d9a45266410adab 122 | 2a0d5e9e14c014863ab7cc67be26b62b 123 | 4546cae9a67c95c46c72bf4f34405667 124 | 45ac5a0ecf78c27803acbbfafb2b7e52 125 | 3c5325b15560e662987be12ba2d74ba0 126 | 1f2e4465020b6181ca24716d5219acc8 127 | 118d253cc23954c4b5507d682fc54898 128 | 579f32f910aa48998b59aa4fdae4025b 129 | c966e3b5ed2ddafae4c0badc7fc9910c 130 | 53dbb211c67df456848eb75f792335cc 131 | 2c5454b5abd660b8a860d19e478ff620 132 | 3011708333470719bc77c6ce806f2816 133 | 8d48c58708116459e58e20e3da9c7214 134 | 6b601df622ec1609c8ea5fa57f275088 135 | 0cb857b17be62b4ff770e0ff01d7f2dc 136 | c9bd2a647180acab2f74cf3732926894 137 | 7d1a2e950eb0e6d6aae0317e4d02a8ae 138 | e07bacb3a2367ccb41fe3c474f318983 139 | 47a760bcada261e738ca8df752d04486 140 | 3d90cdf7a694b087ee8955f52245c3a4 141 | 30299a80833ad83adde9b39edba84dba 142 | 2d0c371a742c66687b0d669e63a69471 143 | 4c6df00f889b516418750caca1258e2b 144 | c18d055db55bdcdb1e6d1665f932b6f1 145 | ba646cacb2bc8061ca3f5b8b5916e058 146 | 7741188be7ad60671951d7ddad9117e4 147 | 1a511cce3decfd221163fd141daef4fd 148 | 72f0dbe88ce06202af770ee81aaca655 149 | a2c6ce5aa97b10d7c3e099fe4068af90 150 | 4d7213e4c5c5e6cb8df2d8c5dba3a52d 151 | a549edb75010c510b32918a20963d85e 152 | e8935b553eb65668af9949cfc551f14b 153 | c3f116ec5e0879806d674708b9da77a0 154 | 36765bc1cbcd9097801bb3acc8616c0d 155 | 3d5ff057d66d8b573e87b45e6595c6e5 156 | 6595eb8e80783cd2203c9eb35b23e5a6 157 | 7dea6934eff207463e198faf7999e28a 158 | d40cfcb858f1265bfdb30beada608919 159 | 310c64e98216ae83da7d39a6a0aace22 160 | 1c8d1bd3bb45d3d0cb972e1d7b74cfb4 161 | 3c115fdf33204d8a208912c315feb831 162 | 99edc3008e96039d1b47d7dc8be48286 163 | 0ae9ac6edcb2e5cc545c4c11e160fdf5 164 | c8000ddb655c8b6177403014add8ebd4 165 | 80e9a5b7683a00bf8f5dba77046d73d5 166 | a3dacf11941f70381055a4e671229b26 167 | 7f8a2872ee48515996295de007cd7b76 168 | dc7dc51e218cd2ed626017052c5c77ea 169 | 0cddb35ba941dca23ea4f370be4751f0 170 | 6b12b7fc216d603e8e07351603851c86 171 | 4d4423857b7b1f38e49738f00e8949ba 172 | 9c4b20a28ad2bd4ab916448f0e1272bd 173 | c00b061c2cfdee4016a869a188135db5 174 | 8a642f0922f7f915e81b2b947276a96c 175 | ed09c9fa5586e2d4d9b4e95fe3b447a0 176 | e1b2722e6d5c509c680b584416d9cb20 177 | 8778f9cd924cae585ca5e2e0b8be3b3f 178 | 4d8c4744ea972fb2fcb9673fea1fc7b7 179 | 3ba6f0e9394f9414e2cadb9495e2d5f5 180 | cbcb12f5f51d6e7d6d8a9fa581aa863a 181 | c98aab3866b99fbae5ab2eb56f5fd785 182 | 5d9bac33be8f2f88391f6de02fb89c73 183 | 94a1f99a64ba24540cc1594d0a0b3152 184 | 72894fb3a3538de240d2f6810aae63c9 185 | 72fdfb2d44c0d41d638e4632bdfc10b8 186 | 686c7cfb20933b41c3d679cbba79a2ad 187 | 1cbc5d5faac431d3e82c9e5ea9588b5f 188 | 412a15b40959ed9cf9330ee79f99e079 189 | ae6fd467da55de31aa7219187cf5c2d4 190 | 6f1aa3a0cb819d97519baa47fd0232d5 191 | 1a3b856f78e9fbdca12aeddc7d665aca 192 | 8e729177bcb4105dd831fb1e123ed1bb 193 | 33615a5f78df822e82e6d3436045c48c 194 | f51d33e7a09fd61ca90ede453515a830 195 | 41c47f01a4c65dcb6efc9ebf483fe762 196 | 094c613f9ed4b8b9d887dc912789043c 197 | a4649bb17f4db4d1c7f879ebceb46ed0 198 | 3bfe7b053a0c59d8a3d38c18f86aa143 199 | 8f6972d84ad188b05ff9cc14d4334949 200 | 8686fda9b2b49e4e1666b54e2248f935 201 | -------------------------------------------------------------------------------- /cache/Cert 360.dat: -------------------------------------------------------------------------------- 1 | 56c9b0569afa478c5be2a04e83904aa8 2 | ffb82e0b05e6be8bd00a0cdf42ba19e2 3 | c384334adf1f843148bc09930920aa58 4 | 8b8cbc9f09180e14d9beaf40f8a19e6f 5 | e6486742b816640aa8af5fa8d5251384 6 | 73006a657cd754e903cda6398499f2c3 7 | 0036b6a88492d925d854a83f63f00b97 8 | 8b994ad3abb532605881c218362eb876 9 | 0df664a9520ae1e14777320ae303a2ed 10 | e38bcb9d859fdc4496254a7425d4d8bc 11 | ab482fa4d4be6a2f06a3f918ef245b7f 12 | 920484737cd9fc0121ce5697641c88f8 13 | 90fffab9d66d505311596a71af6abbb9 14 | e4126033e6653e8f5d84595554a2ba3a 15 | 5209a8ffed474d179b8a882d62ec3a80 16 | bd7e6380055dd5778eb26c10474562a1 17 | 4d1dee02cae7d8cde565f47645ac229b 18 | 24580b4fb69a1db8407211e2cb3464c9 19 | 0b4545f346ae941fb86499887e937bfa 20 | 98a5b68d96d5541e9781ff32ec966a13 21 | 8111f2d99a389337e2d5c308e941c8e5 22 | 45330254ad5d2642f0fa82225aefaefb 23 | 62f500b7a9dc87c0935c4a1ac8f0c990 24 | e789b5055a4a30fd3f2f81447efc91c0 25 | 3f300836f1101aac33c8a0d2e3a13b15 26 | 5b0b816d287d6b909f202e0ae78dd4f2 27 | 02017e32ba80b6610ea0ebe823a8307c 28 | 0ff6a0a7187480b2f5160f7e877b6e7b 29 | f5c4a287130244d1e00dc124d7d36c78 30 | ae733c9e19d8a91d1e36ae4ef7dbcdde 31 | 2401d255767cdbab18ab0add4cda39f8 32 | f3125d3ed890f0d54c88b1ded2feee81 33 | 464f9bbd749d9b7e63993ae0384582d1 34 | 96f44e31e7ad34d978d34d8fa828b8a5 35 | c571983fae71cfe11b5bb86c67159080 36 | 55fd37b2456c87556f03a593901b743a 37 | c8989d2e807ceb53d24ad02bd54fbe60 38 | 4ad53fb76838f4a82d7e011825d5934b 39 | 638b08e6df884cc1a5c0dd7c8ce8c08d 40 | 2b4c95f816268f18f5cb57a0071a4125 41 | d60717f31dc6a08a080990fcf8676fdc 42 | e5210dc9430bc51ba2e6e406c4f32adb 43 | 7b8df1f07a241983726b162aaec16e09 44 | bac04757fb29e6f5a68d734e1b55972d 45 | 65289db6316398217acf197362db4989 46 | d1a48a9c9af9070d037efc5d1b556420 47 | 60b78b7988aacb38f5884e0fbab9c5b6 48 | 9a6490d0223213fdea507a92b46e70c1 49 | 6ddbce6f8b25039edb7b13a95a2cb23e 50 | c7d9bbfa38870b35908acfd1e3942570 51 | b6b572fb400edf12ce0e6a34938ea6f3 52 | be9e00aa3d8a28a4c078ee7b3fa4865b 53 | 7b6e1c8a54653e59e6b19bc5e127c801 54 | 51077656fe9fc37d4140d4ce8100cf7c 55 | 0c30c8f97c81bc0c5862f2959e074cc9 56 | bd54dff060c7e58a91843c0e8e1b8c99 57 | 46c67d8b625a3844f6de918103d0f1be 58 | db011599bbee4c7eaf7f5de90aace14f 59 | ff7b2a220ee1ae11386b5fede1c2884b 60 | b13f7a6b041480cf34bb8732805b6230 61 | c22654761dfc4bd86106c5b7f1f5ab1c 62 | ad4254fec631c297a09f71812f05a763 63 | 76940954759f4d1122fd6cf1ba59354e 64 | 8673ad2a7712694529bdcc80a9b9c795 65 | 2228b404ccd3d527ee5bced401fa3f96 66 | bb1461870abbec4870cb53fd7ca9001b 67 | 41b51bc94ff0953f4b36a03ee8725b4b 68 | b41b352152aab7c6ef57a7aadc61da50 69 | 0f20504a41f3b11e52379d4009a57d44 70 | 7916c575c9d4f0e063a84a8d0e15446e 71 | f3edaf059c6d995891c6600eba69a66b 72 | be9890aef0df3efe1f70af2051219da0 73 | af0acfc7292ff6c219c437915d0e394b 74 | 4f157cb7f00767cb18c727e2be417981 75 | 7542a798bef560092a46b9257931245b 76 | d92e31b54922d78f0bae865e5ab36d61 77 | 02e37cb7c16d12e7403df28ba2b3fa6d 78 | 3411013fd367ea6471b09d5e354b35ca 79 | 2a43b1c37d1c08dccfb3e41f91c73d22 80 | 4835542a408a1bf2d21120a9d53dde91 81 | fb6140d679aeaf4cc7a9c0db715568a5 82 | de81200cf6bb59604da0b1817b29cd54 83 | 9d17c81907549684e71f5c8b80de3202 84 | 0b67f13b9db74dfddbe7afa167388280 85 | 140b3f275cc9bedcc60c01a135f359a5 86 | 94765bc3e9d185457ae053686f3afa52 87 | e1c05f66ae3ab6d5275b9add01266868 88 | 498da2f033a7ca9cfdcc92fa1674141a 89 | b4d15ba2780c8679115ffcaf427eef31 90 | 04b38d66233555e8acf59d0d2e0894d2 91 | b64cdf915999a3a25bf0928358e1d737 92 | cafc6021ec0c27215b9bdfb3838fd8df 93 | 514545c1690627f7268058305a7d534a 94 | c894fbc9ae904917f80b4c06512e5d2f 95 | 19351d1481d82d75e3c0a04283a2b7c4 96 | 9177b0fc2a902ee3f3e3ed6adebe502c 97 | 3688d7ea80028dd62ac68e5ca79a2bf8 98 | 307cae7182ba42236d7878e9551b7700 99 | f2115dbfb3f40f187a4962103721b493 100 | 1b01429693c3f73a4ed8c49c315403e4 101 | 9dca48b776e9960a745f3a4a10876ac2 102 | b1d27d01a4d74e69a33cf632e6de87de 103 | 194d64fd93d7dc6de2c700bed14c6da9 104 | e5144d71091b417ffd2a4443f40d8b65 105 | 22c4bbac2ad26690582c32f7f633cec4 106 | 2bc8023231f29c1409a68b2de58f452e 107 | 588614ec79d3436b389a5966139ee746 108 | a77b40143ed9a718e06e3dc84d5a6e05 109 | f59b37492089e7dabfefe20fdf76ba30 110 | b01c750520c239718c36520a80069835 111 | 94ff42c9ba5ec0e98e01522ef3b80c5e 112 | 90c81d0ff5a3e9ce595ebd560dc5d25e 113 | 74b7513b6c9a0ddf5a31c07e61de3b57 114 | 4b596b38c01ea6fe728ce27a508a44ab 115 | 5a149ee10234d0cdccf1c657f297c33a 116 | 2302ee59f937af9868dfe9834254938f 117 | c17b5efb9dae532717913a9f7d1e6319 118 | b41f08633537b935b5f96086398e24ba 119 | 8ea293b8aa141400cf62a6e7f7c46390 120 | eda03759afadd28c4c20c32a96a80e34 121 | 0b228bf7c0d43556a6261b9eab1ffa46 122 | ea9d2ae53e9fc58c0c692f26990c824a 123 | ede8eb860eccc95f0ac4b911a57717de 124 | 0bccf457cbe52fedf5a73f71f1c91795 125 | adac1daf92ae9567a5e0c667d43f6be3 126 | 14251dd76b8bd9ad5e5a4ac486637ee8 127 | efc4ae30a7585e59f452af74e8669a81 128 | 947b75b656162330cd5ee5f8fdc7fd55 129 | f88263d5c0f631fc975fc8307de44277 130 | 1d6737b30d03a2a4b26b14e0bc4b3159 131 | 93491c9b291bd231c00dce2e6b091ce5 132 | 4d4d26864832b4006010a17f8b7fdc1e 133 | 6cd63c10cef8a5ece122fe2abe6617a3 134 | 5312cc241de31af1d44f84dfdd5eab14 135 | 7e45372e32f455cf4cd7312705c29c89 136 | 3096bc681d3e0c67eded8028e892f0d5 137 | e0eeac094199a36e77b80367b0494ff0 138 | 1538fa4bfe292099cf32080fadf75dbf 139 | dcf75cd8fcc36a3f828105e165c8e9af 140 | c91600e01f1187f5553b8dca3089981d 141 | 31921e8c8c9a26dac03600a684a9184b 142 | a060c3adcbdca0e417cf29f253ca4dc1 143 | ae7c59c867fc0e5ab0dc983ab83cee1b 144 | 5081e486de8459a062bf8bc4d21f0ff6 145 | 208f59eec1fe35d0e926b01894b90d87 146 | abc127605577b3b45890d472aacf86dd 147 | a80663b6475a4d3850b8182e3e6eaccc 148 | 382c73d6388430b9cea6072c6c61858e 149 | ffb5d5f9ba0fa1576f9bd8325a8d3e66 150 | 0c520d1f3614bc8cba4450fee6f03f5d 151 | f91862c02f62f7f8e9d01e209e59487b 152 | 666a3a36b86650d472f7203220b3a4f5 153 | c2b35c67c2732343be5c23579ebcdd04 154 | de12aee5eaff6382190430b22e2c643f 155 | ec39eae21390157f92422897b04aad66 156 | 28f74976e64bebdcd2b71df42f44817e 157 | 300687d61adecf75afb4de6d78398518 158 | 4939f25b3f3d3242726cd400c645be04 159 | f4359caac3c70e9141439aa773e1e8a5 160 | 8fc558ad63c1387fb3ed919bf754820e 161 | 6ff357e8344fde5ea96c964cc0161137 162 | d8c34853fbcc6b39ae0a3783c6fa6d44 163 | 48ff3925c0cc22862b0d6e1f52140bdc 164 | f000a20bfa53fd8b0f5231b52ff34577 165 | 55c72f6f2af616fbddbb643df06c3b3a 166 | bc2c3923f651854c68f2dd6f99d69f0a 167 | 213a4c5c76a220c24da1c38c605fcc10 168 | 194761e30d263596338cc998ac88cbaa 169 | cab02a763bf285b3dc009731f40f8c29 170 | 5e103cbd4bae3244e692ba33c1d7fcf8 171 | b2c0e23dcf540c0b5d2bb144ceade98d 172 | 7119e349c423ea015d6f2a824c67ed63 173 | c1cad147c12a38c089cd941022bc395e 174 | 2e93df858fc2c5b287883dc9313a87fc 175 | 1205680821e2717a58c599f99a9fb422 176 | 448cfa0216a0757ec96f5862f86eafd4 177 | 4d42b2e96c478df11ac597898d1526f0 178 | -------------------------------------------------------------------------------- /cache/NVD.dat: -------------------------------------------------------------------------------- 1 | 011e7506523ac1bdef1b6d04062ef52d 2 | dfb952c602b838369d5e701e4ee89898 3 | 212d02052af5db6e5057e84e48b5bfaa 4 | d9dba402b477e52c4b9defd0cebccaf5 5 | 77baa3c0b221869a260c68659abc2f5d 6 | e956abdb44126053039ff69e318df2d5 7 | 440a7a1d1fbab507babbef6dde2708ca 8 | 270d6ae8a2f36d04903495605b57ffae 9 | 02f797702b02c2c7c51cfedcbb102c58 10 | 45e58fa2b7e6d00ecd7df2f7436fbf82 11 | 27ec837b10d1d64fc1141f1d08ef09dd 12 | 96546eaaab0b20276ee3d77888bc4672 13 | a454ebbb1fd7e02e9295716dd7bc0e6f 14 | 1710699d8371123ca3cce64233b767b1 15 | 23def49e696e1e7b65e0688b8e2cafcf 16 | 3637506db7f9caa7b037faa5bb1a27e1 17 | 88b5bf58c08e5498b9510247ba6f1bfc 18 | 98f89315ef7a854d589877517747f88c 19 | 0c568f923d580907559f0edb8b1c814c 20 | f8be843d72cfa111a7bc5464f5044fcf 21 | 733986ddb7784c7b77ca4ec130dae71a 22 | d892eae6207453b1d49600623a154ca4 23 | 1ff1ae3656c63ca9baeb55cc21d2c6b9 24 | 32b168b09023e0e0888e42c9d2a04678 25 | 3919141bb9f8d69a54c7340402fc12e4 26 | b4ff455b127c0f8a58c003ddb2f09062 27 | bc4f8b0a2fdd92d75afc527ba07f54df 28 | ce007c0fd4e549449e04ab68a5f8099a 29 | bf1177651f278f506277603654e29395 30 | 02340fea4ee136b634597ea70c649455 31 | bb64c0b46df447a73753b916dca2c3bc 32 | c5161faf3a3eb6580c6d438dad415f41 33 | b39b384a7ebb9b35fbb97ca4c596560b 34 | 3a1c41b0221e9e69714ac00c1f689c7c 35 | af51f050df2f52edee3cf4b9c1421a7d 36 | ae35702d617b1f57dd9d2de03baa1725 37 | cfeb1082cd09ea5fdba688c7935da0af 38 | 2d780f5c699548b66024b2b5564c13f3 39 | c0c551e572b417fc30c4d792765a924e 40 | b41bbbf86a3b303b034f15b1e8351a8c 41 | 51882f520ffa8764a9526b69b5cf622f 42 | b6cd946cd522048c77c9695dec86d15e 43 | fcee2554b69f202f00296fa0ba55a8fb 44 | b910ca5b5e1b990a4c5efbe2f7f9e826 45 | 3b0d8be6ee3952844044ef9cfec04259 46 | e459cb5acb6e5ad1d36be2887b2c4b82 47 | 6fd6f5f76d05349deb7ce3944c72eb19 48 | 15920fb5d0a1ca32c641b27396dc9a27 49 | 0ce585a1368341223cf3b6e7dec16365 50 | 89812a1ec371fb3467242d8ead8d812f 51 | d6c2ca275a00ae657d899b750e00ff0a 52 | 44971a4616eae18b8456339a6b8a4aac 53 | bec7bac03a1fc9bae1868d50576bb43b 54 | 135670515eeb4e20cfd56da8732c7e8e 55 | 70779fa2e37aa782f7610955bc5bebab 56 | 6d197530a4c71e20b9966558580335c2 57 | f6eadbd895faa4ef21332c7386ea3487 58 | 3d60ca08181f154eed5d37430959d43d 59 | 948c789ca130dad350d6db413b2d052b 60 | 58bdde507a2e0032e9f3805ba1d8b287 61 | c2bd225b8a1263ffd19a58619a9d5b5c 62 | 75a42330d00696a4e04f0d924623a4ec 63 | 29f20dade62686c47629abeaca99833c 64 | 52e0d35cdc5c18f1e67a524b990d9a1a 65 | c9bfe9e8fb04ca4003eb5c268829099a 66 | 770754b02fc996697d9fc33c0cb7b371 67 | 9b4f6b54e2e270339fce3235cbeeb9cb 68 | 9de83a9a238159de8155e42d5ea69a95 69 | d2004a66841cd3771f7db9195c06113d 70 | 484369e92ce94569937e2c5cb20a2be7 71 | d9cc3e9578febe88197f025edac7ba4e 72 | 46a4ca807945644747e77f4ef837bb87 73 | f642103214e6eb121582585c4af776ab 74 | 63b958f363e5f252dedb7475237f4d02 75 | cd0201466813e950328eecee0b9932bf 76 | 6630454cb632959a46f13deda1d4d491 77 | 2494c75e53cfcde81dc78fdd9a5ba965 78 | 2d600792b7d28909329bdd200bff89d8 79 | f46a7ea33040e3614e5402f9c7504938 80 | 072b301b224d22b1d95ba1ea27725c4d 81 | 6ba3efced8a29604fae243d1fda54c07 82 | 4d3eec34ef34e565edac33ffdc1ed3b4 83 | 6a39af457961c2139e294d359568cc89 84 | 88340e84c2df459ecb53c3a31aad7e95 85 | 808cc7e225d061243c28727041c63a47 86 | 87d873b639d2b8764ee97944b7df6e95 87 | 5d9eec5949601b0cc0c95be9fa23464f 88 | 1973b2a005b6104e5282ab6016d7fa77 89 | 52decef6b09eabe5ed6c5951da9c4c0b 90 | c5101bd2eeb22d37324753723b5011b2 91 | 0dafaaf08d7e2c0903a26c3f5593c0e5 92 | 27b655b283f07e92e4acc055a8c9645c 93 | 752c86d745d9d6748f49970fc6c72bf7 94 | 954dfb5cc2e89810161fe8957b0c430f 95 | eb5bda4dc0e6327328c7fa272c7bbe78 96 | 5a3d81633a3091c2545a1ccd94361ada 97 | afa4b14c773180242d5fba6c6d544eaf 98 | c2154e31c4b2233261938fc3c0a7592c 99 | d47e005093965aa92696b8658f39c6e8 100 | 5861694e663b414eb4b3d9a1f9611c39 101 | 2a431932e781245d25d38026bde6d55e 102 | 10894e27b81cea4adc734c759a4b6f13 103 | 9013ffaf6929ca8f1e345beb5685d17a 104 | 96d0d3b3f23c1498ecfcb263f259a1ba 105 | 8b5b5ee6774908b31928eef9610f228b 106 | d3ba822bdb15a67919cac02cf8aa1fb7 107 | 8e0bb5e55759a9b19da4ce8a5bf48799 108 | 33e0f13e530f11821c6413f2dfd2ee6a 109 | 1865f781093dceb935533905eeacaeb4 110 | 52a8187de01474ef25e7a8cb39ee6dcd 111 | 1d2985a9a2bdf2e919e405ab198710df 112 | 42fbb5379d8738f3eeb6a055d6e6a21f 113 | 97f387904393fc40379da69c6cad0a2d 114 | 503b9f98e318935d59884ba7d0b6d444 115 | 9637804577e375e89e0c34d1e9dc7daa 116 | 528422b82114eedfc8a332c895b5d475 117 | 4b4a8cd15c35de7b7cb3e0f5110f178b 118 | ccc0d1dc9e1e6371fc7ed4a7e6bc67c9 119 | cbd257bda637adc40efbfc5a1a97a8e9 120 | 78578de2036f4c0e411be8c05afb578c 121 | c0b6a93c1283af2f0a467ef5b853f2e3 122 | 3c056fbf4d27f8fdd9b92e328aeb4bc6 123 | 5d092a3543bc05460a30219a3ba5c95b 124 | 8cdd68b75914bdf7f2233265fb225eb5 125 | b14cc76af1a7ec4a7c92f5efdd7b228f 126 | c608240b549dc25f03e04b5397e48e1b 127 | 3e77e980a1bb8d3f84e114c4db41e7da 128 | c4bd3098463c3624a284c838fd6ecb48 129 | f566f5fe536c73ef94e27b5c94518566 130 | e79edbb292a519fa08055a884d86921e 131 | d21339637e69fe8d2469fe6511fbfb0e 132 | e8bc20f545607b74a3b22acab5a43ec3 133 | 590b016eaa38004ca431cfe40b6b6abf 134 | 1d6fb6956287fe0ec69cd029e8ecc115 135 | 88e04b9400084cb05c9c2b8182a1185c 136 | e74d4c90e667eeea48ba2fdded64fa1b 137 | 3ced5d1432807974708ee8a5357e371a 138 | 30de3dc858879c060954c152324e8b83 139 | 1a95b7eb7d6502191d5a3b674c15a12e 140 | 0a917341f1898a729486999144e690c4 141 | 024f30f329ee4e6c1180aa2cf7643c32 142 | 910e3c56609f9e05ecad53ae432368a2 143 | 1895898abc5f86d08e3c1918682e2181 144 | adc6060b4e9a2ef97953b84c25e55a70 145 | 251bf573e4d5344ffc76c72528a16d5e 146 | e0420a2cc40115b55a88f0db3ce592a2 147 | 4d2834fee24bf00aeee5bcbabc5b02b4 148 | ba3d910fb71c6db9625c2addd3c500ae 149 | 5fa1ec891743902c341d1bc89e462fd9 150 | 3f07188b092bd36400c2011cb2a52c09 151 | 1a68553937c0351427cf8632591e6967 152 | c02f090e8bf211e77670100f6a2ad923 153 | c6b3897e8411249dddc03a2582c3afdc 154 | 6638a7519ae20e60ec3fa35f2aa4b04b 155 | bc1805ff98d53e2ef0f4b36f824a320a 156 | 0130b5fbb02b2650cd93ad256f3bd01c 157 | b0b7e69774d910d28494669f530e2627 158 | efc1d5a353aa4e1fc70b7c61d8e9bba2 159 | 57589738b4bb515ac272848489a08d83 160 | 12ef96ad627cd82f6aafe6ab8ded05a1 161 | 790b026d2f9b8a38a121baf7cc9fbbe2 162 | 968982edbb42853901ebf88ea16ad510 163 | ba2f84e8ca511797366257b9b9a5ae2c 164 | f965878f11db19385b42b23ce8b86478 165 | 5fc4ed58eeb8f0435b81ef7f912e3f37 166 | 1f2c404d06acfac83f7761c8ab878dee 167 | c643f1003e7a0ee28d9e54cda26d6b85 168 | 849fc7d111614d4911589eb0ffac6ccb 169 | ce60ea90035140b06002d90390a21a6e 170 | 9e463f5eac984c342543410b41a7b99c 171 | 262cfc8eb247678df1da0f0522b2d4ca 172 | 0265c6782866c15a66a6a397667c733c 173 | 162b98fe4fd13bab7912be8b7d045771 174 | 93f899b49edb371302bbe64a36dc5a26 175 | cff6be4154478d023b5da05bbd08040b 176 | fc2fe917c317458ed4f4442eab2f99d3 177 | bad0fdc1f4c83bb9221659e3326e9614 178 | 12740f755fe40351299db4187efbb5ea 179 | 83857ea2355e35da7b33c4bf4d6bcf38 180 | 65b14a4765f3b567985707b2c268bf11 181 | 8be6ca4933dc297f4d3ecd323cbcac56 182 | 8affd999965e83dbd42583837011424c 183 | 925767e89590e6107a882a20468a3153 184 | a6222d2410a69b583bc8ae8fd0bfe1f6 185 | c668de08f398dd2f7f31569dfc13dd66 186 | 74aeddb68b545a6d042c8577a36bc355 187 | 7d8dad2e2eed577353489b441c07e077 188 | -------------------------------------------------------------------------------- /cache/Nsfocus.dat: -------------------------------------------------------------------------------- 1 | 995de4ef2d7d858c734a015f1fde38ef 2 | 028831c92cb00af4a5f83c8b2989db01 3 | 548e653cf6958231c127c5ff0248facb 4 | 381c1ca7bb03e31f290fed78406b82a2 5 | 5dc02832d788cadc497a0dd3704177a5 6 | 0520a2817c3055ad951bd53463e0be8d 7 | c40e3f0f6788c4194c517dd68a34a1a0 8 | 76258a7259ac21e400c31d58415da3e9 9 | 5a388d078a8cebf078c5a9088eb0986c 10 | 79c85676a5a5b31e912aade65fd55194 11 | b160f0482ad8c16f9892b81ace937841 12 | 96a5c005d70748d1de823c83257e6b23 13 | 01685b849c82e0c95fc4b5c328248cb0 14 | ac6d81e9897469c4806a8330049b5a65 15 | 24522a0f5c2a4cea1c7ae9fd47bf36be 16 | 759a29083d2e7115fc78ee2b9ca9d11b 17 | 67ecb92eccbdc7464b63fe0d4ddfa319 18 | 91a9df352d61b1bbd01e7e728c13d129 19 | 0f08fadbb075828d83d1f634a616d677 20 | 269ec745be5f6a9f923077b9f1a15804 21 | 91caa0ce86e4530fae3aa6c70954f720 22 | 80850e19b5035e92fc9e218d2430383f 23 | 6055d81d3c29b5083d26225d2eca9407 24 | cd9b70908cf12d10458db43479a2dc4e 25 | 3405744156a1052aa943efffbe5e842e 26 | 2efe14c0ae536ee45e5f0c8f78e51b55 27 | 4f616cf24c8a825c95fbeb2a011f9cc8 28 | fd9d8766868a1ef8487ebc3124ea3912 29 | 186b29725f8c3e037613f2043eb994be 30 | 52806aa110878dec1de1f6f2a0049cb1 31 | c9a31257438a02d76a008cf73833a823 32 | b4d8b238c6fc7e06b081cbe30323420a 33 | ec94a78b4bbbc215b4b8c218e7aae6fd 34 | b94f832bb28133ff61d4ce1f8098a4a1 35 | 181c31f7146edea6bef60c2f0b8d79b5 36 | 812ce0454c690412084f2edda326cb3c 37 | e6083ba6da5c40b93e2f685327f5fff8 38 | 3838d86b8db43380c63d4e05d44f6493 39 | 78e58d77a119ff291bddd1a08bf1a4a2 40 | 0c5e3363424a8516f8421d9a74d8cf4b 41 | ee2d4f67b97c72563fab76451abd8058 42 | ac10ebb1ad6e6468f376323e9f85343c 43 | 2715e2dfa454f7adac741bde7307dca3 44 | 2e4c3922ed566d15a645e278abdb2b93 45 | 60a883fde36089649cfe31ea2b53f3ed 46 | 0ed93ab15fc9de46c0478115b0cc4a68 47 | ff1b3af3efbfd3a8bc458a1173b31fe0 48 | d26a28f2038b7bbc0e63859067922933 49 | b37cd2528b43cb7eaaa3cb036ef36169 50 | bb1d70658a0e1430106d7144b1faf799 51 | e1527ffc963ded8d1aeef161a66efc6f 52 | ee2ebdec64be13b0fece6fc6cc5a631b 53 | a62a63a7777f1cf88360763ff0ae4575 54 | 13b74f49cbab56f91acd82408b578828 55 | b699135766445b5e1a4838a384bbc225 56 | 4e13bdca04f36f38b06fbf93560439a4 57 | 4f98f628b26d25e5e08947263b42fa55 58 | 14fb7d4f2712bb94be539fa14360b322 59 | 12e67e912b67c91da650e0323e391cf3 60 | b6f8c2789b15cdfb158bb346bfb68b16 61 | 9ace84370be0dad6b698d2ea71aded26 62 | 218ba1058b459a34d2ec2f59dbf574ff 63 | 490f0c3c4a5596d9bf4b0e482e9a9fd6 64 | 0f4449faf8b52af133131f308cecd2f7 65 | 7a96c71368e706e5ed7ca960bed60eb7 66 | 30a5bff7e3be8b91a337af4f07733942 67 | 746e0cd96e89a41238fa073abdb16b79 68 | 37cf3c4ed7d7c3598160679d9ac6518f 69 | 5a40fde3543a7a5fa241bd96f58244ab 70 | 0bd5274372cbb29284f2461e7d7fde13 71 | 3a42ea60a84499364fde1b9ebd81f796 72 | 4d1d7526a5197e1328a36340d0ebb9b0 73 | 6bc633452f9244d75c6a60314956c02f 74 | c6439919782ed905faa8ff62b542f0b8 75 | 03f35546c3794b7fbb88d31e31128175 76 | 764a9269d1b2d464fc8a72b8c2a48ead 77 | fa9f789f6ef5cab99f2ed181a37dcb56 78 | 99cbe5148f936cb973cbae0cff68f550 79 | a3150cfadd385b4789ff79be36c76884 80 | 093306858dec0bacf3d02c89b21b2f88 81 | a684619655447ce2d9cdb0cb74d810e2 82 | 9fe8e3e92f5d471b63e1f04c08caf503 83 | 3961ce01e33f717f480d8a2403470115 84 | c03ea10575a6242052071be39872751e 85 | b3730e8728596f2ef3c54d2c2ad34ddd 86 | c8471490e527f127796cd1e558c40b7e 87 | 8db43d8d5b69de1e955828c30ee6682f 88 | 78615dee14c81769fbff6e5b77a25940 89 | 85e9fd601cb9f2de306bbe8911afc4f4 90 | afa2674ffa37834a36ba8a428023005a 91 | a89596e0b5c7d5a4a0c407965a59029d 92 | 97beedc37d81e5ea688611eea1e88136 93 | f1e2dcb464918b27e2dcb53f7725246a 94 | aa31355cdc2fdb51e07cb3ebb2e7c203 95 | 635b5ea2ae7be8194aabfa2d39235f22 96 | 69a220500a2f63ba5a49abac55063b65 97 | 400db8da2670ab148d9ebaec57dc9843 98 | 3a10c4f7d638f34e8e4b4e110b0a161c 99 | 772642b80fa30b6251189af73845fce5 100 | d978f089e329f3a4f8347aba0a48bd40 101 | 9d8f11d6ecc0d121ea48e0d45a9af248 102 | 549b0bd2079028433be2e126063dc364 103 | c42ae955548a172ac5684bc488ed1fc9 104 | 5c8d96b92245c488e5af6b3eb0458504 105 | 623b4f7b510be58370c3cd9a257d0218 106 | 9e750ff0f319c07c8eec586b9481ce59 107 | d0d97c585b66e1168481eea5a3293d1e 108 | cb41f4ffb5fae1cff22dfd72d2d6dffc 109 | d116cdbb4909a1372ff9e50b1064c89c 110 | deaa38ed609938992b15c7488a1c7cc4 111 | 47b00dd78a84b9de1a5e9ba1c45ac36d 112 | e64671853956a780ff0e45e6856d0ece 113 | 90338430479c52ce189c4f11b302a524 114 | a144800844335c54ab07ce841da70bb3 115 | 5957d92ad5d046d037efaee85e727a28 116 | e1bbfd6c446ad557b3aebacb3f71142f 117 | 2c38577dfcfb2de1d1d13017e4cf1828 118 | 4258b4ebd3a4e7b641c19b2baf14ece2 119 | f1ebe5e8c4d2b27532decaae22b958c3 120 | 11c80e9d55ccd43a588f386f66557910 121 | 978a3b64cac54d324490e1d9ccb9d973 122 | 937d32d09ab3d79285bd35cefe2e4fc8 123 | b142cb6a61cb3f3bca079b01c03d1daa 124 | 565566dae4c14015c56f1686d51158d9 125 | 88439523bbc7fbb5316a3d53d7ef8045 126 | 48d06e40461ebe2a07d633bbaac7f98b 127 | 091cbc8c2acc33047566c6ba72c0a5f2 128 | 992986b17991ac85700a5c82085792fe 129 | 6dde449c96bd83c445bd0f39adf55b81 130 | b44a11235219206cb5e4232040129753 131 | 6c2b3d895b8b3067dd3c52f6ee79ce05 132 | 3f7a46526136bcfc4aa36cc908a1439c 133 | 7ba57109b7dd16786a8483309a85c322 134 | c82a97b8685e97b527c8a3e5e77a6aec 135 | bfcf0ae29261d226e6d92b3f529566d0 136 | 66a5f8128dd46b94cf5cf0889ddb6a2f 137 | 594a6c0c75f52e6ac2cc9c086c7e7c85 138 | c336469a7d6d36cd3e5c34c8f3871a22 139 | f7102f1f291c358ed438bd11357a6c20 140 | 0b72419d6138cf6dbdccf0b166de9ff8 141 | 973edf69ea91bd917f38ff54f31da950 142 | 5137bdd9ae627ac14cfc3774c96fd40f 143 | 25ff09cfe328651fdefbedc797cfd5bb 144 | aef721f5e85dd45c40b436abf0fd396a 145 | 9cf70586d31975258fafa267ec66d350 146 | c121bf89e4257d65d7c5d426cb6168d2 147 | 9acf72ee079aae1306c392cfbe1cf7ec 148 | 9aea017e180c55b1381ec679320c32a6 149 | 07ff13766e6eda544e413ceb300607e9 150 | 96e0b0c91b06d953b4a5ecfec71bc612 151 | 205143180fd646aa434da08572dc37a5 152 | 78c4aba7419004dcc8345585d527ae37 153 | 2d3fe5437226d262f5c3df68dba66d7c 154 | 319c981098d0f2d7bc91e06390e4800c 155 | 9c491939e6e0bd7c2901366e18b6d07c 156 | b01d6119078e51c36fd74abe01052e61 157 | 1589394801933a9f20626d1ddb8fceee 158 | d03ae50732ec3864b9ee63b6ca0d6819 159 | 2a7dc7fdb9b96a3347032f71650e65e0 160 | 96ac6565cb6d60af90a82f5ca6441700 161 | ef7b44b2166f0d595eba2dc2089677ea 162 | a3bd04b9029a521aaf5f3ffe4484cd2d 163 | 09791539b80d43a3e70c0c615a371846 164 | -------------------------------------------------------------------------------- /cache/QiAnXin.dat: -------------------------------------------------------------------------------- 1 | 90b93cb7073fe73b17746ac166a09637 2 | e318a5efa4803b50cdef480b90b1784d 3 | cffc3035f7899495cfeae521451f91b2 4 | 3e6175d47d17c6f94bd9ba10d81c3717 5 | d99d073afb7d248a8a62fb068921997f 6 | b7b45b14a3af1225ef6eec72d74964df 7 | 504fc79f0123db109a11b149c334b75c 8 | 5b727692d583d4a6e7cdb0f670eac12a 9 | 54b48d765fccbc8dcfa3de0920459f8d 10 | 5b4d5fea09fbc2dca45be53f162d39de 11 | f749eac58b87d0954f0e4a84b5d67057 12 | 89ca61328390365d3cfbdb363912eea6 13 | 6bd01daffa85191c80698354fc8e252f 14 | 45ab4afdafe578698bcfccccd65d833e 15 | 7010355bb6ffff38cb1a885acf784ca7 16 | 74691465618764c64d52a2ff58013ac4 17 | 5edb21a58a7e21692bd0ddd622d39279 18 | 3e8973410ef7c04408d63fa10c230487 19 | 59085bf4ae9a7a3802468d9764c94968 20 | e8bc02a0c3bfbafd4c84d9ec26e9bede 21 | -------------------------------------------------------------------------------- /cache/RedQueen.dat: -------------------------------------------------------------------------------- 1 | a68bbe61ea5180e41509cebe0c9c83ff 2 | 2d94ab1b331ababf10b4988c20ab6f8b 3 | c2b3432e8e5f175dc255a3392a07917e 4 | 6eefd71a8fca3363e93ca909ec09d3c2 5 | 14d5de57a29636247f4b6cb1813a4b43 6 | b7cb94502f33fef81a03de2b90ae3a73 7 | f8c3051e0a0424d48817d257abcc2ba0 8 | 21509b2a1441120bccbe337f92c97a1c 9 | 98e923ffbc6971867808cedd88b21781 10 | facc1dac4e44de63830d6b2237d25a1b 11 | 8c1fab90857e9678be02d0d25557fb37 12 | 46bbcfc29bb0782c1d3401ad84bd39eb 13 | 5cf2bd0925e8c8defc6c0c8b7bd5eda2 14 | c181ad42f71615c7a1bd809c446d5176 15 | 3bea85c74a872139030b50b9a4c907f1 16 | d30d4633a7aa4ef03733cd98ab26dbb0 17 | d129b21df0005d6285f1aac3c3c62f83 18 | ffdb28fd844cd4e1172dae00c1e5eab8 19 | 6a5e2206402c6a82557fedda4b25d0b3 20 | e418030b2e5b4440320effc94cf86456 21 | d2c46746df767e0781c2ec92a2a383cf 22 | 82380e23d0073d28c9910a0f8c787b8f 23 | 99e7b652697be3971338a38d2e3283b3 24 | ba1a5dc1b18872ac044251f32477a5ff 25 | 71d12371c904b3dc1c7730c4215b7840 26 | 6e9089cf71f076e09dcd2a65f35f0f1b 27 | 24d0c5bbf6208ded4257de3d34b40735 28 | f744b5e46098ebe318b82708d1cd5239 29 | 8d2ac023330b598ae35edf1b68f309a9 30 | 89846f7181432114dc858815422e830a 31 | 1bd48a262422bb69100f41c1557e269b 32 | f34b3ad6d52b9343892fab17858a43e6 33 | b1a4f11d9536cad25a01e8516303ac09 34 | 37ac6eafd28e55284d8f2d624655ea23 35 | 83e1c3337db41a19536f7a0fb23061d2 36 | 4ac361d743b6507173669c1528959fa4 37 | 4433e2e667ce1c8a40e130c9994914b1 38 | 3114ecd11fc5abd11779177071f5e586 39 | 6bf9ce86a5c0fd35919b4b2d3b1379e9 40 | 7e3a9f32869a1175360d324db8e235b6 41 | df475bcdaa762b62c35506aac08e2106 42 | 78bb4abce871953b6c49f2d4a6140ccc 43 | f2efb57c0d448ada31c631c855d57723 44 | d06d96c368cfb2ba8faf51e5c166f2df 45 | 8098520618c2782dbdde0c1e27eb02c9 46 | 93b7dcf9b645bdde91f7e7b36fbf6467 47 | 6124697cf99a6a1c2c0b020276d6e0b9 48 | 88608b1e59bd5ae70f83d475c2b48f47 49 | d38c3481897a1e79b29362cc9f59f304 50 | 6c07ce557d6ce5eb7a3b901cad0e4cca 51 | c2c6eb3fd2b0e45b96b6ae22dd039813 52 | 3d2b064184b9431e03de0661bd8641e0 53 | b8457168af4d949e7336edf049aad644 54 | bb52034f7ac7662eb5f5153d2171a13d 55 | e194a314a96aa311d7ecad27516060bf 56 | d53f95a5e55ad32c1c527a37282b8e69 57 | 8cb2c11c1e44f61d2e0dc347dcd12540 58 | b988cc14624040c2620c1c11f6ab24c0 59 | 67fc5e3e235308b852d7264be5fcd5ae 60 | 2be320f27ffd475c6901362f5c7ae06e 61 | 6829cec0287e9c1403521e732567355d 62 | 0a4c7739e957b1d087b49216f936815c 63 | a95ab72502d8206a3fc1db3e578f1592 64 | 309f43cdde3592843023a7953ce470e8 65 | fc720146a116529a0e6711664b621d45 66 | 47c2310ab4fcad6026c009427f2896da 67 | 639191babcbcd74248e32d075575e544 68 | 4437b1133e287a0abb661923af1fc8e7 69 | 1748e434115a984a5b446c03f1d87612 70 | c148f53847c2249d56dff6bf7ed6bf63 71 | fbeba658d41d5c2da8cb62352ca1fa4b 72 | b01a3209483f15d158d0cd1905b045da 73 | 5107e9eca5a7c515e5462edb7e2f05d1 74 | e3f7a9770d69804549bdc486138a4d41 75 | 6620807892142d53394f290d90c13dce 76 | a2be0686ab430dcd8040baca825c4bed 77 | 37f662ef97816d11c05765f18aa0c20a 78 | 205700b3641f1c9a27649d6cb0997c5d 79 | ce8290362b7af7f89d28b90c74d380e4 80 | bbe9631f11d5e8ed8d33d001ed489ad8 81 | c68bc9ad9fa876d2d8e1b55db9bd02ed 82 | c5c37fa0e7e337f05d18253b3313ee2c 83 | bdfc430d4c5f27727e405759e3709d13 84 | 652d3a25267cdfef89ac52e016703b36 85 | d911ed676a541dcbbf2fb5c827e115c2 86 | 53a28e5c7c9e3b28a67726b4c4e55389 87 | a5db5779e86eb0fd7b494a71f67f0277 88 | 024fb79b557b7004d4494f21180eeb58 89 | 20edf5e82a4a1a8b1952db33bf8cfbe5 90 | 1303f89cc2c3b8166983bbe2a5eae130 91 | c07a246bf1a8596313866969c692d6b8 92 | 639877a320c2379f4567840de5112663 93 | 418c6cfc6e16de13ba7a7a05ef2f3777 94 | 970d8b4cc9fc73f7e1d1f6717f9607d3 95 | 6e9a62415a6d721405d639aa522eec7d 96 | a7f64fc4d5a7f582d1116960d5202414 97 | 191521b5bcfc589241dd79ee851776ac 98 | 3a76d67d77e0da0c22523244d84f79b4 99 | f604dfd8e1749bb845cbad4c7facb916 100 | 74c80d8cefe1e65ee7480c52307ac753 101 | dfeb5892551ae562c65bf5b41e334985 102 | a1139a1563da001ed04c88ec8b32b858 103 | c3d2a928933818b599c937465edd51af 104 | cff55acc283ce5c26c911e4985fe029f 105 | b46c8a5f24ee7e962571a41bb5e5e7c1 106 | 1bb21904dd6da22dcc791d1b18c15a59 107 | 89b6997c01a4f690709f59806ddc92ed 108 | 5638be3a32b83030c0deed67583a6d67 109 | f9c8ef1dc7a3631ec0ca04ac00958cbd 110 | 8279923a2ef3f080fd6ac3af116845dd 111 | 5bc13e16c1380886afe8ebde45258e32 112 | cf82cca937d102937eef42e5958a49c8 113 | a83d596463bc6b7cee3ca90428abad7c 114 | 1e47099730c0ebbff1ae83440f8b27a0 115 | 11f2db6eaac452ce61044c05280c6b08 116 | 0001f7264e9b4ed1631028c70456503a 117 | 1d0dc6a86d12da4644a5cdedecd8a31c 118 | 936615b38055c254dc56df4c0b00c3e8 119 | b65931376d5f6bc0e5c32deb3b1c9644 120 | 6e3cea84bbfe2138cca56a1a9c703499 121 | 25a0708c6ed7c0ffa49a5263f5baebea 122 | 80f6900c53b90ed8735f98d7dd306b88 123 | 396d6d5d18b5af0c0aa9d03bf3bfd1e4 124 | f9c6286f83906dc227cd41e9981f6ebb 125 | 4164d69cfba079c67cf85160a4d352ff 126 | 2412eaa3743bd2a3e56e60d82826bba1 127 | 94e227610e893cc7bce61fa7567eecc5 128 | 9d37ecb484a925db0bcaf74edfa3244b 129 | fc9afe1423d7d6562f5fa8708f5e03f5 130 | 0fdf1be3df8bad097b87dc12e6e1b044 131 | ae00cdc6c2d6632451c42e46c384763c 132 | 0f8d14dc587feceee97a30fccdb113af 133 | 54ec56117c199cdf76b79da212e699b2 134 | f2fd960c2dc4c7f726a29ef14c40bf81 135 | aecd0e4daa13449fe6b432cad3fdcf77 136 | aadc1db2de493551c1308573a70a3c69 137 | 462d8ad865718246c2da74ce929d9026 138 | 410b712078b1e4a77bfa05a49195e287 139 | f60e3e49b58f7f845f00113f4bf6373c 140 | 1dd515d6a0bd481d8aa8fef2e379cfef 141 | 35b8a4b658e2c7f85f5708a6749193ac 142 | 07318a2ee7d15e7615cd1ca0d5c704c9 143 | a909254ba545cef6d55edc1448c9ee45 144 | dc2daf7d570550f9f2444f730584dd77 145 | e1239160caa2fb4bcb62b0d4f0e345c0 146 | 42129927e77643c66e8a8c0a78609df2 147 | 32860043ee5c5ba3f6a2e82b424c068d 148 | d41523792d447e5820c05c89ffedefdf 149 | a7c85b33e9e552493c474cb2f63811ca 150 | f04b4d6d3dc73adfd949f777bd9f440b 151 | e539f6cb4c3c30a60fa143219fccdc33 152 | 664b8eae9346458073b9977d8bb24dd9 153 | 00fe6f1c9ee41c5c006319e576bc1739 154 | 1d5bed0771ca3f4b9233f538795e9183 155 | 68a5b3207ea49c2290177fec4d27f434 156 | 231236788ff4c47e41ba089a83bf0120 157 | d138a1d12dcb2fd1dc99a325daa30731 158 | ab21ef769d4f49ac2476e018d090036e 159 | 0e51c4f951404ac9ca8a4d6a90fcb1bc 160 | 2d7ac90aba61008dfcc8249464b4ac3f 161 | -------------------------------------------------------------------------------- /cache/Tenable (Nessus).dat: -------------------------------------------------------------------------------- 1 | 19ed551557e7d472a2a105368fbf98a5 2 | 6d2a86fc7f48755d8d60706786793a0a 3 | d8d00a56746b97b82d8fca85af5b22c3 4 | 95ab3591090671df1063539ca4f03b10 5 | a34ea01c5e8f9da5dfd27b25c108cb7d 6 | 251482219fb212c746d0722a93190261 7 | c8e3f430d19d4ab2c49903d1c3d40438 8 | 51755a0380f5217629d1e692242bdf63 9 | bf7728cebfc141aeefac420691d495f9 10 | 1d35a47f06b8ed27a76d3c2e674acabe 11 | d3aa783afb8012797a3e924050813fe4 12 | a4e6a8dff8a57126f16aec7a52a32bd1 13 | a05f6969638295c77d53a89f3484f9f1 14 | 622eb917b57f7fd788d0e40d93c60407 15 | d5363970a14434e4e8ad46bb7bc55bb5 16 | 54bda0efaf67cc898a51a91c563edcfb 17 | 22a9fe01f35d523bd3e0fa22309475f6 18 | 4e3515a7f25dba59b73ad5b0fda57103 19 | 80fc4be54bf76d7265b4d56584a1b71c 20 | 0bfe065aad50b490ae90cc819df690c9 21 | ca99edc9e5f509f0985658c59510f0c0 22 | 9c61f58a744363694b24c67e6063730d 23 | ef5cf1e32d8fa4efb89027d281d6b876 24 | 5ae838bb4df79538746e18090827d726 25 | 673fbab3d93948fd14f69ae3717631c2 26 | 17674408f798e528da3a3d4ae0262d6f 27 | ca9d4a13790d82510c8bef9e67933fb8 28 | 1fbb9df63d052417d0684f95bc6ae406 29 | 1797e462cb21a5efa225bcfc20d0d8a2 30 | fae9696e26c87d51ef8699dec2adc2a4 31 | 8300d1f801cdb1ecfb977c31a467faf6 32 | 7934e47c5fc06bedb4b33c80b7907394 33 | 0e5130964d8a29affe557da5767fc762 34 | bc05224623fa002bd02915844472a431 35 | 9e40a7a6a576bb8aced6385de7d0acbf 36 | 61f95293821627ce1bb6cdacf58a7153 37 | 56e96fdab6c44becc1f227ff1363f8b8 38 | 793ddf83ecb1ca24a4c1748f038ee000 39 | e395290c5a796138286bc4f081867454 40 | f1bc31ddd91e64b9eb5aa5cd1d340b9f 41 | c4a811157d72bddb732a218b93782df2 42 | cda436da9a97de59803fcf52c20e0d07 43 | 9a5c9f046995d52cc08c6aff9065ea7c 44 | 22c0a0750201c261067a762d732a307d 45 | 816dee99275ce4658bdf70faeb802c1e 46 | 2fbaa91f111875b83d7127848e25cdc8 47 | 5aa968950a280b7799e50af1b8668926 48 | c6bbd6328180db5536ec81ad6f31776a 49 | ff582f077ce2f47e11d4dd1c666d21c2 50 | 6bbc93c9ce16e1ac2f299710302e7c8f 51 | 24811a6a4c5ef866944a30315ed3eb38 52 | 7467a1155d3075545a08462606580232 53 | b05b36378b2621877bb6979f4fd9b87b 54 | 19f81abdb34aa56c60b69fcab199943c 55 | dd853842842167f803837b5f3bdb392c 56 | 473ea458783982fbdd41aed5d321bc31 57 | 84c2ede976d2e84cdd33cfed4a742130 58 | 3ada0082247c70802495e9bb3404d989 59 | c722c4bf897247d1e1be3407f2bd98f1 60 | ac643e77e8a593fc5941c72b587e7aed 61 | fde3d3789921f9229330eafb165055c8 62 | b8c9eedd4dac51e71cebc37caffb521c 63 | a1eb17f3bd626dc51e48956cac3f4456 64 | 58b630fcbebd55ef9d471bffd287d887 65 | 013dc452f70394e246d3d91ec79c6bbd 66 | 4586209802ef3d21c414ed574e07a23c 67 | 00913c727e2def10652fc0d2c1ee9af9 68 | 4eeee42edb4cc1e28abf804a1152ac78 69 | 02db7f667b68ead7ff67d115d3de1cdb 70 | c3f4b753b4b336897ee1776eca6527e3 71 | 7d2a2b56ff6f7ab9903e8ec20433dea6 72 | ced9dd19330fb76e84dc14e8e5f2909c 73 | 3a787c0cef93c82162f5b8733bdcdbd3 74 | 4b9e46b53f9174b8d095133df6c5f4ed 75 | b60d9ca6e2b5265fa67c627a73e511f5 76 | fc104aa76e00416c9b1c09f272a0a3a5 77 | 65b55059b2fb079b735b5204a7bd0ce7 78 | f8b95f604b6829686be2081626b90fb7 79 | b1ee61d159ced4570991d0cdd0754d3b 80 | c343817e9992df7126365b19d3522c5e 81 | b064d512ad9322fb0dbcd558323fc909 82 | 60e53736040219e841d479b4e8517bf6 83 | 9f705cc5c25fa2ee946ce447a2fb6e2c 84 | 282512d489e0a674943f396ddf827d3c 85 | 98ca716c2ad20d6175ecec6b491462ae 86 | fc5f02fb3d88a3a66a98bca7b972049d 87 | b5540f59352ef3374301f596b7d16c9d 88 | 7f3e152f9b6360475d99ff7fae2748c4 89 | f5d822dc856b25e52a740490404a4c16 90 | f34dc765311f4382ab1715fbdbff44d4 91 | 7d28e2af29976a70e53ff32d27edc40f 92 | 9688fb82db439a6f85d7c8a29570ddcb 93 | 8ece56c110c77d44a338c8f05c55ec7d 94 | a5978d333d850678e3d7d11edb5f4094 95 | a45fc853c256717f120b7d35cae7b3ed 96 | 7724606451f51f0cfb924f8e5d7c48d7 97 | 1dde64d3cbcf10192973d6a2e4d93de5 98 | a5ff21a2e77b003e0435961ae483555c 99 | 2dd1893b6ce8855ab8728b02a08f899b 100 | bc1532839c0177808ead633972f8a1cd 101 | d50a98a54db2d115437a67401537cee4 102 | 2a51c93a0f0004f280c772aa8a19b10f 103 | 0ac738d1a2e6d363cfdb010602329eac 104 | c8776ac40a36af786a92b6a7c6f3768e 105 | 142453401bee8f91b4cdb79b84befc1b 106 | 72b3bb032f4ea59b896065bc9f684cdb 107 | 800492765698e3ff04dbcc3182225057 108 | 053dbebb256ef2c23987b5012b4a6c8d 109 | a69855202e535e9f21e7c0dc2c6e3286 110 | 1c6416fd54b9d4fddeaaca7c17d243b8 111 | eea619ce7274e82915b162b9c294944d 112 | f4c293a995d8a56533372b11acca9611 113 | b5c0b37f854b1dd4ecdadeb55cf1e04c 114 | f59bafaa1873e5a81e68204497955cf1 115 | b34441dcd15658ff314b1ceafdb830a8 116 | 8c621c685a93efe5207e5f2e83d8c7ee 117 | 9e1877c38804abc0a2dde78e715c2bd3 118 | f94ca9d71628e4dcbb813a9dd434782e 119 | e578502edc6630ccad9d2ca4c2590d84 120 | f606d9a5e591f73c157b8ffda03f5437 121 | 0a892f153e103cd7887473c51ae44e15 122 | 365f25d3c3fa92d3302278e2007971c3 123 | 89b146c425dd301ed45ef2302d6103dd 124 | 130eda084da2e634270c032b71befbeb 125 | 4f93c76b69d7f2d6aaa2cf87b8c312f3 126 | fa8902d25666a71fdb934bd2394c160f 127 | 21db8bea75f2cd583421d1e8e72e8467 128 | 85da650329f30babb2000a45635d3a92 129 | 6ca79343369f16a6c1ac454460c8424b 130 | b70664277c94b79c9057c64e97f2e3d0 131 | 8dce2cec7382fe71eba98c80fd7231d4 132 | 70ec332ed3c6efb0bbd79779cfabdcce 133 | 0d0299400a367b0c5141f326f9b615a1 134 | d8fe15bd40085b7f7c894c2f99a96521 135 | 0809ed33dcc61ec82b61490b9f629c62 136 | 6bdad484ca0181fdce54181c35054aff 137 | b2ef5d7f3845c4bc828b9963fdb57482 138 | c25572a5898539c69fdedce2336f6fb6 139 | b8a84f3979bc5b0800f9f24b210e3b94 140 | 33bc39cf60abcd75454132f368b59083 141 | 3ddccf0456b09efcc960c29498e57a62 142 | 5feffd384d963ea0915442d828f04269 143 | 9859099d6299398b3d5ac676992d2878 144 | cf2e2cc457db61da3fbddd1f348a7d87 145 | 7a93e2c4a8905a9cb2ccc3d3c3245b4d 146 | ff5e8c94bafc76d99a9de7dc8a53b154 147 | 3b8ea96b09af0ae260d1cea9bf86bb2b 148 | 636078c91ce0070e358d25fa1b0ada70 149 | ae60cd323832f7653cf1c70fe498dc1f 150 | e0f204cc3de9d0c18dd9fc861c99d878 151 | c19a52d36105bad5ee759533ae9f0be0 152 | 4275e51bae2efdfa920cbba5fb172a9f 153 | 3412fa2102834fdf1dcd3db0cb6069dd 154 | d886d981bb5d8f072d39750d6bb768c1 155 | d4c4c7b221080f9344c7d7d0bb55ac6d 156 | 5693ce81271595c674f6561a0e74ddeb 157 | c28e4251ae642ed9bc907cc386c78041 158 | fbf39b54ba5474d324d654af7196bacf 159 | 2d80975aaf1c72dc02cdf60696897a64 160 | f8aad58a5de1e6ece8b54ebb393779cf 161 | 53b8f37210e42ede6f3209266fc96939 162 | 3767b2a57ecfaf8b8a3c2498b5ed4b56 163 | 6ea89a50d59e29de9c373c6edaa04a68 164 | 8b1674124a295a166a57f104da65b9c6 165 | -------------------------------------------------------------------------------- /cache/vas.dat: -------------------------------------------------------------------------------- 1 | faa5de1bb89669fb071e637486ce1226 2 | 262557113cf7c8f230d66347b7c13095 3 | 62445307db0fa2eaea15de0fe87244f1 4 | 49ed8eb720e2789ac5628199620acfc5 5 | 66cb99b686cd672c59a987932426f2a2 6 | 1c15a02dd010cce875fa17c62e8a6744 7 | f3eaf5ed93894997dba63f54b75954a2 8 | 33c9ba9230b0c4b1f5e9be27d94c6c83 9 | f5213bb234f7ace64b1e7f589b14a588 10 | a5dece26eda9c61326eaf760295bee9e 11 | f1b6a4dddb3273c977403c1562eaeb50 12 | 0be3522e2508660253076f6946fc6f09 13 | e0b1eb551a9d697c09bb7a4a5e768822 14 | c402239a2e2ab99831c369678a96c78a 15 | 82e14a200dd2185f80f0e8d48b367856 16 | 8357277f9bed148d1cc121ce3d896206 17 | f5d5444f4300e6888895f87c99767aad 18 | e9083d8dabbb7de0819e80de97ece633 19 | bf2f255cd2e0469c75d3a0986313c8c0 20 | 72de7c8bb424eef47c3de386db610f8e 21 | 1ef4493fa8bfe22c58c0b0217f1c93a1 22 | 7aef8587f2d46bc6984821c2390d7971 23 | decf1fc6dd38f2d825179d8c71048e5d 24 | 3187455b723b3a7725f124e8c2b99f56 25 | cf65dc10a5ed234d993b25c2569267d2 26 | 5aa0edec1ca8705c1dcdb1a9d19adf39 27 | 21f9ec04a0387f4dde404806a575e303 28 | 878aef4dec16992514c57910c49eebe0 29 | cef4e6981588d55ac66a0c47ff80bd14 30 | ce8024e41996507e8864b9287c65f08b 31 | 3b68283e9eea642f20712b31fd81f720 32 | b351dea40476a8e36e8840b360f0e591 33 | 181f578e7c4177ed1ff0d8f639922b09 34 | 08d8ba8f9a2e1a6fc8cf7c5cfa8bbc24 35 | be560e03f7d0364699f43d794fc6ef37 36 | fa152bee4bae982f163f810cf96ff9d7 37 | 8c4d36acf05e3f4bb14e8ed313e75053 38 | 25cbb773b6a89a3716fc3a506c8b76d8 39 | 3fce43582e1d1612c5fab3ce9e3a703b 40 | adb0815eadc8bfe202f8c2c3f9627151 41 | 18c53fc80d1290e6609cfd697988edb3 42 | ca696583193d7a3e523a9244b51234c8 43 | e447b6103bd3484660a8ebad700bfd88 44 | 4e9d6d61d281d6222d095439e9be3d01 45 | fe641c5260a2776449026132e23bb633 46 | 1d7ee24f2901ddf37aeb98ccee6860c0 47 | c53899e17bb99e72c26a50891bfaaa58 48 | 58dd177414d5a7f6be24321ccb4e8617 49 | 07e5628c0aa5289c6cfd7f22b75c9481 50 | 5933116115eeeaeb4de0f2170f3d016d 51 | 1b1695140e14e77738f02be5b6c390f1 52 | 1ca52c925f4caae6425f3fde97dadb79 53 | e24aa9f6bc8de2f5a5c26f521f1ecab7 54 | c4de1572047cc389046c24f3c08a6032 55 | 798406bf8b68124deca9085d3eb2d1c5 56 | e3e5335fb40b2591fe2db20109b721f8 57 | 653950b848400677d6b639ceab859948 58 | d260fd6bfb4e9ac71fb3d9e8ac099e8a 59 | 49c6f9e6d3305e3f6a1b9e819a546f5e 60 | 137a4e2d822964f8f8c93f59d00f2bce 61 | 7cb0c487c17f2247b0b81ef4bc51f47b 62 | 4d9035105f60b9d56f24c24e87fc6e32 63 | 906de48de24b85a2278ae80a9f4d0aa8 64 | 2131ca2cbd7b631f62f8701a925c2767 65 | 4184ae9f57a2db9063367e64e6cc2cb7 66 | c5bfeca05acdc931e8686c9e3d4ff937 67 | ed706209d0185b2415915cac4afec37b 68 | 86cb552f791b9e8159d01a9478a59f9d 69 | b36f311a6a1cb8b7c4d2da09512e0fa9 70 | e00d270224089dec1dde09bb05ec2678 71 | 68ee7b98acb8ba2e45c3638a078d9535 72 | a0f1f4b9e08c161feea107db8c47d55e 73 | 2b425329012f167ceeee133dcab6c49c 74 | 68be9e619a7702aa2cb4d58c255d39c8 75 | e2d8ba6cd503627461acaa0de23c51b6 76 | a418a10f7f4a1694a2293e895b24de6a 77 | 6b34ab872bd97043b7699554194da23f 78 | c1d2650c12cb12d9ee21f53d0f087be8 79 | 45a46bc77eb26e67020f43cf08f1fcc6 80 | 1911c90c4cf886d9867ff81b4756eb3f 81 | 1e193280a8f45427c06cb4945be4f126 82 | 392b133d98d6f61aee36ce6c8784f4df 83 | 43456ae172e45c12087c40c03d925e0e 84 | af4f5f63390eb00de8705b5029d8c376 85 | 76cad61d2d5a8750a6a714ab2c6dbc97 86 | 88a8c676b52a739c0335d7c21ca810a9 87 | 0aa6eab412c0318b74c6a470ee774df1 88 | 485f2c57713f4a39830e8c2d01e43cfe 89 | a2795e4829bff16f108cf191eba663c3 90 | d09f0641bf65c64a16d802cd78e14097 91 | 69052e2a8c09416f5df674f92cba25a6 92 | 5f42b6f584a9ace426787dc8dfd6e6e5 93 | 79556071f6236ab4674f75b3beee4d79 94 | f7a5dcd376be777c6593a29b8ebd411a 95 | 71ed541bb737196268b75c7ba435e1a9 96 | f421bcdb306e2bc1ffbf58fcb024a0dd 97 | 6c4124fed44906a79843cd2dd383c695 98 | 0473358d95e58c7c3f2e7db0109f56f4 99 | a888c948ca1172f8a06a3879479f1de4 100 | f5b543501ed5679d423411edac502e24 101 | 07c09799b08afb04c63a9de750b70aca 102 | bcf7253d2ee580c618737de137d370c4 103 | e2938ff82d0cc152508e0240697def4c 104 | 945fd6e612634d9721f861833f1ecb75 105 | 95525e3f5907a776dc7cd4f87f2e2154 106 | eebe93468b36d2ca24cf4b82136a5635 107 | 8b47000e1abfbacdadb7df6f09152d89 108 | 844719cf0bb4843aff73d2f33cc6dd0b 109 | 6018f718b2d751478bf1ce069ac65f0d 110 | 096b6298d82574500dc1a14c9dba4065 111 | -------------------------------------------------------------------------------- /config/settings.yml: -------------------------------------------------------------------------------- 1 | database: 2 | dbtype: 'sqlite' 3 | dbpath: './data/cves.db' 4 | sqlpath: './script/cves-create.sql' 5 | 6 | github: 7 | graphql: 'https://api.github.com/graphql' 8 | repo: 'threat-broadcast' 9 | owner: 'lyy289065406' 10 | gtk: "<%= ENV['GTK'] %>" # Github Token,若非空值则使用 Github Actions 发送播报邮件 11 | auto_commit: False # 使用 Github Actions 时不需要开启:自动提交变更到仓库(可自动归档、生成 Github Page) 12 | 13 | crawler: 14 | top: 30 # 播报时每个来源最多取最新的前 top 个 CVE 15 | 16 | notify: 17 | mail_smtp: 'smtp.qq.com' 18 | mail_user: 'threatbroadcast@qq.com' # 用于发送播报信息的邮箱账号 19 | mail_pass: "<%= ENV['MAIL_PASS'] %>" 20 | qq_user: '123742030' # 用于向 QQ 群发送播报信息的 QQ 账号 21 | qq_pass: "<%= ENV['QQ_PASS'] %>" 22 | 23 | -------------------------------------------------------------------------------- /data/.empty: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aabyss-Team/threat-broadcast/a5f6e85ff071ad3a2784ddd8471bfd5a48e7984c/data/.empty -------------------------------------------------------------------------------- /data/cves.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aabyss-Team/threat-broadcast/a5f6e85ff071ad3a2784ddd8471bfd5a48e7984c/data/cves.db -------------------------------------------------------------------------------- /docs/css/page.css: -------------------------------------------------------------------------------- 1 | * 2 | { 3 | margin:0; 4 | padding:0; 5 | border:0; 6 | } 7 | 8 | body 9 | { 10 | font-family:PingFangSC-Regular, Verdana, Arial, '微软雅黑','宋体'; 11 | font-size:14px; 12 | } 13 | 14 | strong 15 | { 16 | font-family:'微软雅黑'; 17 | font-size:18px; 18 | color:#3f3f3f; 19 | font-weight:800; 20 | } 21 | 22 | div#maincontent h2 23 | { 24 | font-size: 18px; 25 | color:#3f3f3f; 26 | } 27 | 28 | body#homefirst div#maincontent, div#maincontent h1, div#maincontent h2, div#sidebar div#ad h2 29 | { 30 | font-family:'微软雅黑'; 31 | } 32 | 33 | pre, pre code, div#maincontent input, div#maincontent select, div#maincontent textarea 34 | { 35 | font-family:Consolas, "Courier New", Courier, monospace; 36 | } 37 | 38 | h2, h3, h4, h5, h6, em 39 | { 40 | font-weight: bold; 41 | } 42 | 43 | p.note span, p.important span, p.tip span, p.inherited, p.inherited span, p.gototop, .html5_new_note span 44 | { 45 | font-weight: bold; 46 | } 47 | 48 | p.tip span { 49 | color:#ff9955; 50 | } 51 | 52 | p.tip2 { 53 | background: #BBEDB8 url(/ui2017/tip.png) top left no-repeat; 54 | display:block; 55 | padding:15px 15px 15px 50px; 56 | color:#000; 57 | border-radius:5px; 58 | background-position:15px 15px; 59 | } 60 | 61 | body#homesecond div#navsecond li 62 | { 63 | font-weight:bold; 64 | } 65 | 66 | div#sidebar div#ad h2, body#homefirst div#maincontent h3 67 | { 68 | font-size: 14px; 69 | } 70 | 71 | div#maincontent h3 72 | { 73 | font-size: 16px; 74 | } 75 | 76 | div#maincontent h4 77 | { 78 | font-size: 14px; 79 | } 80 | 81 | div#maincontent button, div#maincontent input, div#maincontent select, div#maincontent textarea 82 | { 83 | font-size:12px; 84 | } 85 | 86 | body#homefirst div#maincontent div#w3 h2 87 | { 88 | font-size:20px; 89 | } 90 | 91 | em 92 | { 93 | font-style:normal; 94 | } 95 | 96 | pre code 97 | { 98 | color:#0000dd; 99 | } 100 | 101 | .html5_new_note 102 | { 103 | background: #ffffff url(/i/html5_new_note.png) top left no-repeat; 104 | padding-left:20px; 105 | } 106 | 107 | .html5_new_note span 108 | { 109 | color:blue; 110 | } 111 | 112 | p.gototop 113 | { 114 | text-align:right; 115 | } 116 | 117 | div#maincontent button 118 | { 119 | margin-top:15px; 120 | } 121 | 122 | 123 | 124 | 125 | /* ----------------------------------- layout ----------------------------------- */ 126 | html { 127 | min-width: 1210px; 128 | background-color: #fdfcf8; 129 | overflow:scroll; 130 | overflow-x:hidden; 131 | } 132 | 133 | body 134 | { 135 | text-align: center; 136 | margin: 0; 137 | padding: 0; 138 | border: 0; 139 | background: #fdfcf8; 140 | } 141 | 142 | div#wrapper 143 | { 144 | margin: 0 auto; 145 | padding: 0; 146 | border: 0; 147 | width: 1239px; 148 | text-align: left; 149 | background: transparent url(/ui2017/wrapper.png) top left repeat-y; 150 | } 151 | 152 | div#navsecond 153 | { 154 | float: left; 155 | margin: 0 0 0 6px; 156 | padding: 0; 157 | border: 0; 158 | width: 180px; 159 | background : transparent; 160 | } 161 | 162 | html>body div#navsecond 163 | { 164 | margin-left: 12px; 165 | } 166 | 167 | div#maincontent 168 | { 169 | float: left; 170 | margin: 0; 171 | padding: 30px 0 0 0; 172 | border: 0; 173 | width: 850px; 174 | background: transparent; 175 | } 176 | 177 | div#maincontent div{ 178 | width: 810px; 179 | margin: 0 0 0 25px; 180 | padding: 30px 0 30px 0; 181 | border:0; 182 | border-bottom: 1px solid #aaa; 183 | } 184 | 185 | div#sidebar 186 | { 187 | float: left; 188 | margin: 0; 189 | padding: 0; 190 | border: 0; 191 | width: 180px; 192 | background: transparent; 193 | } 194 | 195 | div#footer 196 | { 197 | clear: both; 198 | margin: 0; 199 | padding-top: 16px; 200 | margin-left: 12px; 201 | width: 1210px; 202 | line-height:24px; 203 | background: #f0f0f0; 204 | border-top: 0px solid #fff; 205 | background: #fdfcf8 url(/ui2017/footer.png) top left repeat-x; 206 | font-family:PingFangSC-Regular, '微软雅黑', Verdana, Arial, '宋体'; 207 | } 208 | 209 | div#footer #p1 210 | { 211 | font-size:12px; 212 | color:#777777; 213 | text-align:center; 214 | background: transparent url(/ui2017/alert.png) no-repeat; 215 | background-position:235px 2px; 216 | } 217 | 218 | div#footer #p2 219 | { 220 | margin: 30px 0 30px 0; 221 | font-size:14px; 222 | text-align:center; 223 | color:#777777; 224 | } 225 | 226 | div#footer #p1, div#footer #p2, div#footer #p2 a { 227 | max-height: 999999px; 228 | } 229 | 230 | 231 | /* ----------------------------------- header ----------------------------------- */ 232 | div#header, div#header_index 233 | { 234 | margin: 0 0 0 12px; 235 | padding: 0; 236 | border: 0; 237 | width: 1210px; 238 | height: 100px; 239 | background-color:#fdfcf8; 240 | } 241 | 242 | div#header a, div#header_index a, div#header_index h1 243 | { 244 | text-indent: -9999px; 245 | margin: 0; 246 | padding: 0; 247 | border: 0; 248 | overflow:hidden; 249 | float:left; 250 | } 251 | 252 | div#header a:link, div#header a:visited 253 | { 254 | display: block; 255 | width: 372px; 256 | height: 90px; 257 | background : transparent url(/ui2017/bg.png) 0 -150px no-repeat; 258 | margin: 0; 259 | padding: 0; 260 | border: 0; 261 | } 262 | 263 | div#header a:hover 264 | { 265 | background: transparent url(/ui2017/bg.png) 0 -250px no-repeat; 266 | } 267 | 268 | div#header div#ad_head 269 | { 270 | float:right; 271 | width:728px; 272 | height:90px; 273 | background-color:#efefef; 274 | margin-top:5px; 275 | } 276 | 277 | div#header_index a:link, div#header_index a:visited, div#header_index h1 278 | { 279 | display: block; 280 | width: 500px; 281 | height: 100px; 282 | background : transparent url(/ui2017/bg.png) 0 -150px no-repeat; 283 | margin: 0; 284 | padding: 0; 285 | border: 0; 286 | } 287 | 288 | div#header_index h1 289 | { 290 | display: block; 291 | } 292 | 293 | div#header_index a:hover 294 | { 295 | background: transparent url(/ui2017/bg.png) 0 -250px no-repeat; 296 | } 297 | 298 | 299 | 300 | /* ----------------------------------- search form ----------------------------------- */ 301 | div#searchui 302 | { 303 | margin:0; 304 | padding:0; 305 | width:306px; 306 | height:100px; 307 | background-color: transparent; 308 | float:right; 309 | } 310 | 311 | #searchui input.button 312 | { 313 | padding:0; 314 | margin:0; 315 | background:#AE4141; 316 | font:12px Verdana, Arial, Helvetica, sans-serif; 317 | color:#FFFFFF; 318 | width:30px; 319 | height:30px; 320 | } 321 | 322 | #searchui input.box 323 | { 324 | margin:0; 325 | margin-top:35px; 326 | width:256px; 327 | height:28px; 328 | background:#fdfdfd; 329 | font:12px Verdana, Arial, Helvetica, sans-serif; 330 | border:1px solid #ddd; 331 | } 332 | 333 | 334 | 335 | /* ----------------------------------- index -----------------------------------*/ 336 | 337 | 338 | body#homefirst div#maincontent div 339 | { 340 | padding-top:0; 341 | padding-bottom:30px; 342 | width:810px; 343 | } 344 | 345 | body#homefirst div#maincontent div#d1 346 | { 347 | text-align:center; 348 | } 349 | 350 | body#homefirst div#maincontent div#partner 351 | { 352 | width: 307px; 353 | float: left; 354 | } 355 | 356 | body#homefirst div#maincontent div#update 357 | { 358 | width: 300px; 359 | float: left; 360 | margin:0; 361 | } 362 | 363 | body#homefirst div#maincontent div#d1 h2 364 | { 365 | margin-top:35px; 366 | font-size:24px; 367 | } 368 | 369 | body#homefirst div#maincontent div#d1 p 370 | { 371 | margin-left:0; 372 | font-size:18px; 373 | } 374 | 375 | body#homefirst div#maincontent p 376 | { 377 | font-size:16px; 378 | margin-left:110px; 379 | } 380 | 381 | body#homefirst div#maincontent h3 382 | { 383 | margin-top:35px; 384 | margin-left:110px; 385 | font-size:24px; 386 | } 387 | 388 | body#homefirst div#maincontent div.idea 389 | { 390 | padding: 0; 391 | padding-bottom:30px; 392 | min-height: 118px; 393 | } 394 | 395 | body#homefirst div#maincontent div#d2 396 | { 397 | background : transparent url(/ui2017/icon2.png) 0 0 no-repeat; 398 | } 399 | 400 | body#homefirst div#maincontent div#d3 401 | { 402 | background : transparent url(/ui2017/icon3.png) 0 0 no-repeat; 403 | } 404 | 405 | body#homefirst div#maincontent div#d4 406 | { 407 | background : transparent url(/ui2017/icon4.png) 0 0 no-repeat; 408 | } 409 | 410 | body#homefirst div#maincontent div#d5 411 | { 412 | background : transparent url(/ui2017/icon5.png) 0 0 no-repeat; 413 | } 414 | 415 | body#homefirst div#maincontent div#d6 416 | { 417 | background : transparent url(/ui2017/icon6.png) 0 0 no-repeat; 418 | } 419 | 420 | body#homefirst div#maincontent div#d7 421 | { 422 | background : transparent url(/ui2017/icon7.png) 0 0 no-repeat; 423 | } 424 | 425 | body#homefirst div#maincontent div#d8 426 | { 427 | background : transparent url(/ui2017/icon8.png) 0 0 no-repeat; 428 | border:0px; 429 | } 430 | 431 | body#homefirst div#maincontent div#d9 { 432 | background: transparent url(/ui2017/icon9.png) top left no-repeat; 433 | } 434 | 435 | body#homefirst div#maincontent div#d10 { 436 | background: transparent url(/ui2017/icon10.png) top left no-repeat; 437 | } 438 | 439 | body#homefirst div#maincontent div.idea img 440 | { 441 | margin:0; 442 | float:left; 443 | } 444 | 445 | body#homefirst div#maincontent div#d9, body#homefirst div#maincontent div#d10 { 446 | margin-left:75px; 447 | margin-top:10px; 448 | width:290px; 449 | float:left; 450 | border:0; 451 | } 452 | 453 | body#homefirst div#maincontent div#d9, body#homefirst div#maincontent div#d10 { 454 | margin-left:75px; 455 | margin-top:15px; 456 | float:left; 457 | border:0; 458 | min-height:87px; 459 | } 460 | 461 | body#homefirst div#maincontent div#d9, body#homefirst div#maincontent div#d10 { 462 | width:290px; 463 | } 464 | 465 | body#homefirst div#maincontent div#d10 { 466 | width:299px; 467 | } 468 | 469 | body#homefirst div#maincontent div#d9 h3, body#homefirst div#maincontent div#d10 h3 { 470 | font-size:14px; 471 | margin:23px 0 0 58px; 472 | color:#777; 473 | font-weight:400; 474 | } 475 | 476 | body#homefirst div#maincontent div#d9 p, body#homefirst div#maincontent div#d10 p { 477 | font-size:14px; 478 | margin:0 0 0 58px; 479 | line-height:normal; 480 | } 481 | 482 | div#d9 p a { 483 | color:#000; 484 | } 485 | 486 | 487 | /* ----------------------------------- navfirst -----------------------------------*/ 488 | div#navfirst 489 | { 490 | height: 48px; 491 | width: 1210px; 492 | margin: 0 0 0 12px; 493 | padding: 0; 494 | border: 0; 495 | background: #E8E7E3; 496 | } 497 | 498 | div#navfirst ul#menu 499 | { 500 | height: 48px; 501 | width: 1210px; 502 | background: transparent url(/ui2017/bg.png) top left no-repeat; 503 | margin: 0; 504 | padding: 0; 505 | position: relative; 506 | } 507 | 508 | div#navfirst ul#menu li 509 | { 510 | margin:0; 511 | padding:0; 512 | list-style:none; 513 | position:absolute; 514 | top:0; 515 | } 516 | 517 | ul#menu li,ul#menu a 518 | { 519 | display: block; 520 | height: 48px; 521 | border-bottom:0; 522 | } 523 | 524 | div#navfirst ul#menu li a 525 | { 526 | text-indent: -9999px; 527 | overflow:hidden; 528 | text-decoration: none; 529 | } 530 | 531 | #h {left:0;width:155px;} 532 | #b {left:155px;width:157px;} 533 | #s {left:312px;width:167px;} 534 | #d {left:479px;width:158px;} 535 | #x {left:637px;width:101px;} 536 | #ws {left:738px;width:185px;} 537 | #w {left:923px;width:177px;} 538 | 539 | #h a:hover {background: transparent url(/ui2017/bg.png) 0 -48px no-repeat;} 540 | #b a:hover {background: transparent url(/ui2017/bg.png) -155px -48px no-repeat;} 541 | #s a:hover {background: transparent url(/ui2017/bg.png) -312px -48px no-repeat;} 542 | #d a:hover {background: transparent url(/ui2017/bg.png) -479px -48px no-repeat;} 543 | #x a:hover {background: transparent url(/ui2017/bg.png) -637px -48px no-repeat;} 544 | #ws a:hover {background: transparent url(/ui2017/bg.png) -738px -48px no-repeat;} 545 | #w a:hover {background: transparent url(/ui2017/bg.png) -923px -48px no-repeat;} 546 | 547 | body.html #h {background: transparent url(/ui2017/bg.png) 0 -48px no-repeat;} 548 | body.browserscripting #b {background: transparent url(/ui2017/bg.png) -155px -48px no-repeat;} 549 | body.serverscripting #s {background: transparent url(/ui2017/bg.png) -312px -48px no-repeat;} 550 | body.dotnet #d {background: transparent url(/ui2017/bg.png) -479px -48px no-repeat;} 551 | body.xml #x {background: transparent url(/ui2017/bg.png) -637px -48px no-repeat;} 552 | body.webservices #ws {background: transparent url(/ui2017/bg.png) -738px -48px no-repeat;} 553 | body.webbuilding #w {background: transparent url(/ui2017/bg.png) -923px -48px no-repeat;} 554 | 555 | 556 | 557 | 558 | 559 | /* Default links */ 560 | a:link, a:visited { 561 | text-decoration : none; 562 | color : #900b09; 563 | background : transparent; 564 | border-bottom:1px solid #900b09; 565 | } 566 | 567 | a:hover { 568 | text-decoration : none; 569 | color: #ff0000; 570 | background : transparent; 571 | border-bottom:1px solid #ff0000; 572 | } 573 | 574 | a:active { 575 | text-decoration : none; 576 | color : #ff0000; 577 | background : transparent; 578 | } 579 | 580 | div#navsecond li.currentLink a:link, div#navsecond li.currentLink a:visited { 581 | text-decoration : none; 582 | color:#ff0000; 583 | background : transparent; 584 | } 585 | 586 | div#navsecond li.currentLink a:hover { 587 | text-decoration : underline; 588 | color : #ff0000; 589 | background : transparent; 590 | } 591 | 592 | div#navsecond a:link, div#navsecond a:visited { 593 | text-decoration : none; 594 | color:#000; 595 | background : transparent; 596 | } 597 | 598 | div#navsecond a:hover { 599 | text-decoration : underline; 600 | color : #000; 601 | background : transparent; 602 | } 603 | 604 | div#navsecond a:active { 605 | text-decoration : underline; 606 | color : #000; 607 | background : transparent; 608 | } 609 | 610 | div#navsecond a#link_help { 611 | color:#0479A7; 612 | } 613 | 614 | div#navsecond a#link_about { 615 | color:#0479A7; 616 | } 617 | 618 | div#maincontent .partner a { 619 | color:#000; 620 | } 621 | 622 | div#footer a { 623 | border-bottom:none; 624 | } 625 | 626 | div#footer a:link, div#footer a:visited { 627 | text-decoration : none; 628 | color:#777777; 629 | background : transparent; 630 | } 631 | 632 | div#footer a:hover { 633 | text-decoration : underline; 634 | color : #000; 635 | background : transparent; 636 | } 637 | 638 | div#footer a:active { 639 | text-decoration : underline; 640 | color : #000; 641 | background : transparent; 642 | } 643 | 644 | 645 | /* ----------------------------------- Typography ----------------------------------- */ 646 | 647 | div#maincontent p 648 | { 649 | margin: 12px 0 0 0; 650 | line-height: 150%; 651 | } 652 | 653 | div#maincontent h1 { 654 | margin:0 0 0 25px; 655 | font-size: 28px; 656 | font-weight:400; 657 | } 658 | 659 | div#maincontent h3, div#maincontent h4{ 660 | margin:25px 0 0 0; 661 | } 662 | 663 | #homefirst div#navsecond h2:first-child, #homefirst div#sidebar h2:first-child { 664 | margin:10px 0 0 0; 665 | } 666 | 667 | body#homesecond div#navsecond li { 668 | margin:5px 0 0 0; 669 | } 670 | 671 | div.backtoreference p{ 672 | margin:0; 673 | } 674 | 675 | div#w3school p { 676 | margin-left:15px; 677 | } 678 | 679 | div#maincontent div p:first-child { 680 | margin: 0; 681 | } 682 | 683 | p.important span { 684 | color:#dd0000; 685 | } 686 | 687 | p.inherited { 688 | color:#ff0000; 689 | } 690 | 691 | p.inherited span { 692 | color:#999; 693 | } 694 | 695 | p.chinese span { 696 | color:#0000ff; 697 | } 698 | 699 | pre { 700 | width:765px; 701 | margin: 15px 0 0 0; 702 | padding: 20px; 703 | border: 0; 704 | border: 1px dotted #785; 705 | background: #f5f5f5; 706 | line-height:1.4; 707 | font-family:Consolas; 708 | } 709 | 710 | pre code { 711 | color:#0000dd; 712 | } 713 | 714 | pre span { 715 | color:#999; 716 | } 717 | 718 | pre span.code_comment { 719 | color:#999; 720 | } 721 | 722 | blockquote 723 | { 724 | margin:15px; 725 | } 726 | 727 | div#maincontent ul, div#maincontent ol { 728 | margin-top:10px; 729 | margin-left:35px; 730 | margin-bottom:0; 731 | } 732 | 733 | div#maincontent li { 734 | margin-top:3px; 735 | } 736 | 737 | div#navsecond ul, div#navsecond li, div#sidebar ul, div#sidebar li { 738 | margin: 0; 739 | padding: 0; 740 | } 741 | 742 | div#navsecond ul, div#sidebar ul { 743 | margin-left: 12px; 744 | } 745 | 746 | div#navsecond li, div#sidebar li { 747 | list-style: none; 748 | } 749 | 750 | div#navsecond li.list_apart { 751 | margin-top:10px; 752 | } 753 | 754 | img { 755 | border:0; 756 | } 757 | 758 | div#maincontent img { 759 | margin:25px 0 0 25px; 760 | } 761 | 762 | body#homesecond dl { 763 | margin:0; 764 | padding:0; 765 | } 766 | 767 | body#homesecond dt 768 | { 769 | font-weight: bold; 770 | font-size: 14px; 771 | margin:0; 772 | padding:0; 773 | } 774 | 775 | body#homesecond dd { 776 | color:#000088; 777 | margin:10px 0 0 0; 778 | padding:0; 779 | } 780 | 781 | body#homesecond dd p { 782 | margin:0; 783 | padding:0; 784 | } 785 | 786 | 787 | div#maincontent div#toc div { 788 | margin:0; 789 | margin-top:15px; 790 | margin-bottom:35px; 791 | padding:0; 792 | border:0; 793 | } 794 | 795 | div#toc img { 796 | float:left; 797 | margin:0; 798 | margin-right:10px; 799 | } 800 | 801 | div#toc div dt, div#toc div dl { 802 | margin-top:0; 803 | } 804 | 805 | div#example dl, div.example dl, div#moreexamples dl, div#toc dl, div#referencelist dl { 806 | margin: 10px 0 0 0; 807 | } 808 | 809 | div#example dt, div.example dt, div#moreexamples dt, div#toc dt, div#referencelist dt { 810 | margin:15px 0 5px 0; 811 | } 812 | 813 | div#example dd, div.example dd, div#moreexamples dd, div#toc dd, div#referencelist dd { 814 | margin:0; 815 | } 816 | 817 | dl.define 818 | { 819 | margin: 10px 0 0 0; 820 | } 821 | 822 | dl.define dt 823 | { 824 | margin:15px 0 3px 0; 825 | font-weight:bold; 826 | color:#0479A7; 827 | } 828 | 829 | dl.define dd 830 | { 831 | margin:10px 0 0 10px; 832 | line-height: 150%; 833 | } 834 | 835 | span.deprecated { 836 | color:#e80000; 837 | } 838 | 839 | .marked, pre code span.marked { 840 | color:#dd0000; 841 | } 842 | 843 | p.gototop { 844 | text-align:right; 845 | } 846 | 847 | div#maincontent canvas.canvas_example { 848 | border:1px solid #d3d3d3; 849 | background:#ffffff; 850 | width:300px; 851 | height:150px; 852 | margin-top:15px; 853 | } 854 | 855 | div#maincontent div.panel,p.flip { 856 | width:400px; 857 | margin:0; 858 | padding:5px; 859 | text-align:center; 860 | background:#e5eecc; 861 | border:solid 1px #c3c3c3; 862 | } 863 | 864 | div#maincontent p.flip { 865 | margin-top:15px; 866 | } 867 | 868 | div.panel { 869 | display:none; 870 | } 871 | 872 | div#maincontent input[type=text] 873 | { 874 | border:1px #bebebe solid; 875 | height:30px; 876 | padding-left:10px; 877 | margin:15px 0 0 0; 878 | } 879 | 880 | div#maincontent input[type=submit], button 881 | { 882 | border:1px #bebebe solid; 883 | height:30px; 884 | padding-left:5px; 885 | padding-right:5px; 886 | } 887 | 888 | div#maincontent input[type=submit]:hover, button:hover 889 | { 890 | border:1px #999 solid; 891 | } 892 | 893 | div#maincontent select 894 | { 895 | border:1px #bebebe solid; 896 | height:25px; 897 | margin:15px 0 0 0; 898 | } 899 | 900 | 901 | /* ----------------------------------- 表格 ----------------------------------- */ 902 | 903 | table.dataintable { 904 | margin-top:15px; 905 | border-collapse:collapse; 906 | border:1px solid #aaa; 907 | width:100%; 908 | } 909 | 910 | table.dataintable th { 911 | vertical-align:baseline; 912 | padding:5px 15px 5px 6px; 913 | background-color:#3F3F3F; 914 | border:1px solid #3F3F3F; 915 | text-align:left; 916 | color:#fff; 917 | } 918 | 919 | table.dataintable td { 920 | vertical-align:text-top; 921 | padding:6px 15px 6px 6px; 922 | border:1px solid #aaa; 923 | } 924 | 925 | table.dataintable tr:nth-child(odd) { 926 | background-color:#F5F5F5; 927 | } 928 | 929 | table.dataintable tr:nth-child(even) { 930 | background-color:#fff; 931 | } 932 | 933 | table.dataintable pre { 934 | width:auto; 935 | margin:0; 936 | padding:0; 937 | border:0; 938 | background-color:transparent; 939 | } 940 | 941 | table.dataintable p {margin:0 0 2px 0;} 942 | 943 | div#maincontent table.dataintable ul, div#maincontent table.dataintable li { 944 | list-style-type:none; 945 | margin:0; 946 | padding:0; 947 | } 948 | 949 | table.dataintable td em 950 | { 951 | color:#0000ff; 952 | font-weight:normal; 953 | } 954 | 955 | table.dataintable .table_value {color:#0F93D2;} 956 | 957 | .no_wrap {white-space:nowrap;} 958 | 959 | div#maincontent table.dataintable ul.listintable { 960 | margin:20px; 961 | padding:0; 962 | } 963 | 964 | div#maincontent table.dataintable ul.listintable li{ 965 | list-style-type:disc; 966 | } 967 | 968 | 969 | table.dataintable td.html5_new { 970 | background: transparent url(/ui2017/table_bg_html5.png) top right no-repeat; 971 | } 972 | 973 | tr.notsupported { 974 | color:#999999; 975 | } 976 | 977 | 978 | 979 | /* ----------------------------------- browsersupport ----------------------------------- */ 980 | table.browsersupport td 981 | { 982 | text-align:center; 983 | } 984 | 985 | #jsref table.browsersupport td, #tags table.browsersupport td, #cssref table.browsersupport td 986 | { 987 | width:20%; 988 | } 989 | 990 | #jsref table.browsersupport th, #tags table.browsersupport th, #cssref table.browsersupport th 991 | { 992 | color:#333333; 993 | font-weight:400; 994 | } 995 | 996 | #jsref table.browsersupport, #tags table.browsersupport, #cssref table.browsersupport 997 | { 998 | width:70%; 999 | } 1000 | 1001 | table.browsersupport .bsIE { 1002 | background-image: url('/ui2017/compatible_ie.png'); 1003 | } 1004 | 1005 | table.browsersupport .bsFirefox { 1006 | background-image: url('/ui2017/compatible_firefox.png'); 1007 | } 1008 | 1009 | table.browsersupport .bsChrome { 1010 | background-image: url('/ui2017/compatible_chrome.png'); 1011 | } 1012 | 1013 | table.browsersupport .bsSafari { 1014 | background-image: url('/ui2017/compatible_safari.png'); 1015 | } 1016 | 1017 | table.browsersupport .bsOpera { 1018 | background-image: url('/ui2017/compatible_opera.png'); 1019 | } 1020 | 1021 | table.browsersupport .bsNoIE { 1022 | background-image: url('/ui2017/incompatible_ie.png'); 1023 | } 1024 | 1025 | table.browsersupport .bsNoFirefox { 1026 | background-image: url('/ui2017/incompatible_firefox.png'); 1027 | } 1028 | 1029 | table.browsersupport .bsNoChrome { 1030 | background-image: url('/ui2017/incompatible_chrome.png'); 1031 | } 1032 | 1033 | table.browsersupport .bsNoSafari { 1034 | background-image: url('/ui2017/incompatible_safari.png'); 1035 | } 1036 | 1037 | table.browsersupport .bsNoOpera { 1038 | background-image: url('/ui2017/incompatible_opera.png'); 1039 | } 1040 | 1041 | table.browsersupport .bsPreIE { 1042 | background-image: url('/i/precompatible_ie.gif'); 1043 | } 1044 | 1045 | table.browsersupport .bsPreFirefox { 1046 | background-image: url('/i/precompatible_firefox.gif'); 1047 | } 1048 | 1049 | table.browsersupport .bsPreChrome { 1050 | background-image: url('/i/precompatible_chrome.gif'); 1051 | } 1052 | 1053 | table.browsersupport .bsPreSafari { 1054 | background-image: url('/i/precompatible_safari.gif'); 1055 | } 1056 | 1057 | table.browsersupport .bsPreOpera { 1058 | background-image: url('/i/precompatible_opera.gif'); 1059 | } 1060 | 1061 | table.browsersupport { 1062 | margin-top:15px; 1063 | border-collapse:collapse; 1064 | } 1065 | 1066 | table.browsersupport td { 1067 | padding: 0; 1068 | height: 86px; 1069 | width:86px; 1070 | vertical-align: middle; 1071 | background:#fdfcf8 no-repeat center; 1072 | border:1px solid #ddd; 1073 | } 1074 | 1075 | table.browsersupport .browser_version td { 1076 | padding: 0; 1077 | height: 36px; 1078 | vertical-align: middle; 1079 | text-align: center; 1080 | background-color:#F5F5F5; 1081 | border:1px solid #ddd; 1082 | } 1083 | 1084 | table.browsersupport td.bsProperty 1085 | { 1086 | font-family: courier new; 1087 | white-space: nowrap; 1088 | width:20%; 1089 | } 1090 | 1091 | table.browsersupport th { 1092 | padding: 0; 1093 | height: 36px; 1094 | vertical-align: middle; 1095 | text-align: center; 1096 | background-color:#F5F5F5; 1097 | border:1px solid #ddd; 1098 | } 1099 | 1100 | 1101 | 1102 | /* ----------------------------------- prenextnav ----------------------------------- */ 1103 | 1104 | div#tpn, div#bpn { 1105 | height:29px; 1106 | width:230px; 1107 | margin: 0; 1108 | padding: 0; 1109 | border: 0; 1110 | background: transparent; 1111 | } 1112 | 1113 | div#tpn ul.prenext, div#bpn ul.prenext { 1114 | height:29px; 1115 | width:230px; 1116 | background: transparent url(/ui2017/bg.png) 0 -580px no-repeat; 1117 | margin:0; 1118 | padding:0; 1119 | border:0; 1120 | position:relative; 1121 | } 1122 | 1123 | div#tpn ul.prenext li, div#bpn ul.prenext li { 1124 | margin:0; 1125 | padding:0; 1126 | list-style:none; 1127 | position:absolute; 1128 | top:0px; 1129 | overflow:hidden; 1130 | } 1131 | 1132 | ul.prenext li, ul.prenext a { 1133 | display:block; 1134 | height:29px; 1135 | } 1136 | 1137 | div#tpn ul.prenext a, div#bpn ul.prenext a { 1138 | text-indent: -9999px; 1139 | text-decoration: none; 1140 | } 1141 | 1142 | .pre {left:0; width:105px;} 1143 | .next {left:125px; width:105px;} 1144 | 1145 | .pre a:hover {background: transparent url(/ui2017/bg.png) 0px -629px no-repeat;} 1146 | .next a:hover {background: transparent url(/ui2017/bg.png) -125px -629px no-repeat;} 1147 | 1148 | 1149 | 1150 | 1151 | 1152 | /* ----------------------------------- navsecond ----------------------------------- */ 1153 | div#course { 1154 | background:transparent url(/ui2017/bg.png) 0 -700px no-repeat; 1155 | padding:66px 0 10px 0; 1156 | } 1157 | 1158 | div#afterschool { 1159 | background:transparent url(/ui2017/afterschool.png) 0 0 no-repeat; 1160 | padding:45px 0 10px 0; 1161 | } 1162 | 1163 | div#selected { 1164 | background:transparent url(/ui2017/bg.png) -200px -700px no-repeat; 1165 | padding:45px 0 10px 0; 1166 | } 1167 | 1168 | 1169 | 1170 | 1171 | /* ----------------------------------- sidebar ----------------------------------- */ 1172 | div#tools { 1173 | background:transparent url(/ui2017/bg.png) -400px -700px no-repeat; 1174 | padding:79px 0 10px 22px; 1175 | margin:0; 1176 | } 1177 | 1178 | body#homesecond div#tools { 1179 | background:transparent url(/ui2017/bg.png) -400px -700px no-repeat; 1180 | padding:66px 0 10px 0; 1181 | margin:0; 1182 | } 1183 | 1184 | div#books { 1185 | background:transparent url(/ui/bg.gif) -450px -326px no-repeat; 1186 | padding:45px 0 0 15px; 1187 | margin:0; 1188 | } 1189 | 1190 | div#ad { 1191 | background:transparent url(/ui2017/bg.png) -600px -700px no-repeat; 1192 | padding:66px 0 10px 10px; 1193 | margin:0; 1194 | } 1195 | 1196 | div#sidebar div#ad:first-child { 1197 | background:transparent url(/ui2017/bg.png) -800px -700px no-repeat; 1198 | padding:66px 0 10px 10px; 1199 | margin:0; 1200 | } 1201 | 1202 | 1203 | div#sidebar div#ad h2 { 1204 | color:#000000; 1205 | margin:0 0 25px 25px; 1206 | } 1207 | 1208 | div#ad span { 1209 | margin:0 0 15px 0; 1210 | } 1211 | 1212 | 1213 | /* ----------------------------------- sidebar banner ----------------------------------- */ 1214 | 1215 | div#tools h5 { 1216 | margin: 0 0 12px 0; 1217 | padding: 0; 1218 | overflow:hidden; 1219 | } 1220 | 1221 | div#tools h5#tools_reference, div#tools h5#tools_example, div#tools h5#tools_quiz, div#tools h5#tools_search { 1222 | text-indent: -9999px; 1223 | width: 136px; 1224 | height: 64px; 1225 | } 1226 | 1227 | div#tools h5#tools_reference a, div#tools h5#tools_example a, div#tools h5#tools_quiz a, div#tools h5#tools_search a { 1228 | display: block; 1229 | margin: 0; 1230 | padding: 0; 1231 | width: 100%; 1232 | height: 100%; 1233 | text-decoration: none; 1234 | } 1235 | 1236 | div#tools h5#tools_reference a { 1237 | background: transparent url(/ui2017/bg.png) 0 -400px no-repeat; 1238 | } 1239 | 1240 | div#tools h5#tools_reference a:hover { 1241 | background: transparent url(/ui2017/bg.png) 0 -464px no-repeat; 1242 | } 1243 | 1244 | div#tools h5#tools_example a { 1245 | background: transparent url(/ui2017/bg.png) -150px -400px no-repeat; 1246 | } 1247 | 1248 | div#tools h5#tools_example a:hover { 1249 | background: transparent url(/ui2017/bg.png) -150px -464px no-repeat; 1250 | } 1251 | 1252 | div#tools h5#tools_quiz a { 1253 | background: transparent url(/ui2017/bg.png) -300px -400px no-repeat; 1254 | } 1255 | 1256 | div#tools h5#tools_quiz a:hover { 1257 | background: transparent url(/ui2017/bg.png) -300px -464px no-repeat; 1258 | } 1259 | 1260 | 1261 | 1262 | 1263 | 1264 | 1265 | div#maincontent p.tiy{ 1266 | border:none; 1267 | display:inline-block; 1268 | outline:0; 1269 | padding:8px 18px; 1270 | margin-top:15px; 1271 | margin-bottom:10px; 1272 | vertical-align:middle; 1273 | overflow:hidden; 1274 | text-decoration:none; 1275 | color:#fff; 1276 | background-color:#e9686b; 1277 | text-align:center; 1278 | transition:.2s ease-out; 1279 | cursor:pointer; 1280 | white-space:nowrap; 1281 | box-shadow:0px 2px 6px rgba(0,0,0,0.12), 0px 1px 2px rgba(0,0,0,0.24); 1282 | font-family:'微软雅黑'; 1283 | border-radius:2px; 1284 | } 1285 | 1286 | div#maincontent p.tiy:last-child{ 1287 | margin-bottom:0px; 1288 | } 1289 | 1290 | div#maincontent p.tiy a { 1291 | border:0px; 1292 | } 1293 | 1294 | div#maincontent p.tiy a:link, div#maincontent p.tiy a:visited { 1295 | color:#fff; 1296 | text-decoration:none; 1297 | } 1298 | 1299 | div#maincontent p.tiy:hover{ 1300 | background-color:#ba3537; 1301 | color:#fff; 1302 | text-decoration:none; 1303 | } 1304 | 1305 | div#maincontent p.tiy a:active { 1306 | color:#fff; 1307 | text-decoration:none; 1308 | } 1309 | 1310 | div#navsecond h2, div#sidebar h2 { 1311 | font-size: 14px; 1312 | margin:0; 1313 | padding:10px 0 5px 10px; 1314 | color:#000; 1315 | display:block; 1316 | border-bottom:0px solid #ddd; 1317 | font-family:'微软雅黑'; 1318 | } 1319 | 1320 | div#navsecond h2#link_about, div#navsecond h2#link_help { 1321 | font-size: 14px; 1322 | margin:0; 1323 | margin-left:10px; 1324 | padding:0; 1325 | color:#000; 1326 | display:block; 1327 | } 1328 | 1329 | div#navsecond h2#link_about { 1330 | margin-top:20px; 1331 | margin-bottom:15px; 1332 | } 1333 | 1334 | div#navsecond h2#link_help { 1335 | margin-bottom:20px; 1336 | } 1337 | 1338 | div#navsecond h2#link_about a, div#navsecond h2#link_help a { 1339 | display:inline; 1340 | padding:0; 1341 | font-size:14px; 1342 | border-bottom:0px solid #ddd; 1343 | text-decoration:none; 1344 | color:#0479A7; 1345 | } 1346 | 1347 | div#navsecond h2#link_about a:hover, div#navsecond h2#link_help a:hover { 1348 | border-bottom:1px solid #0479A7; 1349 | color:#0479A7; 1350 | background-color:transparent; 1351 | } 1352 | 1353 | div#navsecond ul, div#navsecond li, div#sidebar ul, div#sidebar li { 1354 | margin: 0; 1355 | padding: 0; 1356 | font-family:'微软雅黑'; 1357 | } 1358 | 1359 | 1360 | div#navsecond li, div#sidebar li { 1361 | list-style: none; 1362 | } 1363 | 1364 | div#navsecond a, div#sidebar a { 1365 | display:block; 1366 | padding:5px 0 5px 15px; 1367 | font-size:12px; 1368 | border-bottom:0px solid #ddd; 1369 | text-decoration:none; 1370 | } 1371 | 1372 | div#navsecond ul a.active { 1373 | background : #f5f5f5; 1374 | color:#990000; 1375 | } 1376 | 1377 | 1378 | div#navsecond a:link, div#navsecond a:visited { 1379 | text-decoration : none; 1380 | color:#000000; 1381 | background : transparent; 1382 | } 1383 | 1384 | div#navsecond a:hover { 1385 | text-decoration : none; 1386 | color : #fff; 1387 | background : #aaa; 1388 | } 1389 | 1390 | div#sidebar a:hover { 1391 | text-decoration : none; 1392 | color : #fff; 1393 | background : #BD2D30; 1394 | } 1395 | 1396 | div#navsecond a:active { 1397 | text-decoration : none; 1398 | color : #fff; 1399 | background : #BD2D30; 1400 | } 1401 | 1402 | div#navsecond li.currentLink a:link, div#navsecond li.currentLink a:visited { 1403 | text-decoration : none; 1404 | color:#ffffff; 1405 | background-color: #BD2D30; 1406 | } -------------------------------------------------------------------------------- /docs/imgs/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aabyss-Team/threat-broadcast/a5f6e85ff071ad3a2784ddd8471bfd5a48e7984c/docs/imgs/github.png -------------------------------------------------------------------------------- /docs/imgs/new.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aabyss-Team/threat-broadcast/a5f6e85ff071ad3a2784ddd8471bfd5a48e7984c/docs/imgs/new.gif -------------------------------------------------------------------------------- /docs/imgs/wechat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aabyss-Team/threat-broadcast/a5f6e85ff071ad3a2784ddd8471bfd5a48e7984c/docs/imgs/wechat.png -------------------------------------------------------------------------------- /imgs/email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aabyss-Team/threat-broadcast/a5f6e85ff071ad3a2784ddd8471bfd5a48e7984c/imgs/email.png -------------------------------------------------------------------------------- /imgs/secrets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aabyss-Team/threat-broadcast/a5f6e85ff071ad3a2784ddd8471bfd5a48e7984c/imgs/secrets.png -------------------------------------------------------------------------------- /imgs/sponsor.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aabyss-Team/threat-broadcast/a5f6e85ff071ad3a2784ddd8471bfd5a48e7984c/imgs/sponsor.jpg -------------------------------------------------------------------------------- /imgs/wechat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aabyss-Team/threat-broadcast/a5f6e85ff071ad3a2784ddd8471bfd5a48e7984c/imgs/wechat.png -------------------------------------------------------------------------------- /logs/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aabyss-Team/threat-broadcast/a5f6e85ff071ad3a2784ddd8471bfd5a48e7984c/logs/.keep -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/4/25 22:17 5 | # ----------------------------------------------- 6 | 7 | import argparse 8 | from src.config import settings 9 | from color_log.clog import log 10 | from pypdm.dbc._sqlite import SqliteDBC 11 | 12 | from src.crawler.cert360 import Cert360 13 | from src.crawler.nsfocus import Nsfocus 14 | from src.crawler.qianxin import QiAnXin 15 | from src.crawler.redqueen import RedQueen 16 | from src.crawler.anquanke import AnQuanKe 17 | from src.crawler.vas import Vas 18 | from src.crawler.nvd import NVD 19 | from src.crawler.cnvd import CNVD 20 | from src.crawler.cnnvd import CNNVD 21 | from src.crawler.tenable import Tenable 22 | 23 | import src.notice.page as page 24 | import src.notice.mail as mail 25 | import src.notice.qq as qq 26 | import src.notice.wechat as wechat 27 | import src.utils._git as git 28 | 29 | 30 | GIT_CRAWL_PWD = "AabyssTeam6666" 31 | 32 | 33 | def args() : 34 | parser = argparse.ArgumentParser( 35 | prog='', # 会被 usage 覆盖 36 | usage='威胁情报播报 - 帮助信息', 37 | description='从多个公开的威胁情报来源爬取并整合最新信息', 38 | epilog='\r\n'.join([ 39 | '使用示例: ', 40 | ' python main.py -t 10 --gtk {GRAPAQL_TOKEN}', 41 | ]) 42 | ) 43 | parser.add_argument('-g', '--git', dest='git', type=str, default=GIT_CRAWL_PWD, help='Github Action 的启动密码(避免被 Fork 时别人可以直接运行,导致目标站点被 DDos)') 44 | parser.add_argument('-t', '--top', dest='top', type=int, default=30, help='播报时每个来源最多取最新的前 N 个 CVE') 45 | parser.add_argument('-ac', '--auto_commit', dest='auto_commit', action='store_true', default=False, help='自动提交变更到仓库(因使用 Github Actions ,故默认关闭)') 46 | parser.add_argument('-k', '--gtk', dest='gtk', type=str, default='', help='Github Token,若非空值则使用 Github Actions 发送播报邮件') 47 | parser.add_argument('-ms', '--mail_smtp', dest='mail_smtp', type=str, default='smtp.qq.com', help='用于发送播报信息的邮箱 SMTP 服务器') 48 | parser.add_argument('-mu', '--mail_user', dest='mail_user', type=str, default='threatbroadcast@qq.com', help='用于发送播报信息的邮箱账号') 49 | parser.add_argument('-mp', '--mail_pass', dest='mail_pass', type=str, default='', help='用于发送播报信息的邮箱密码') 50 | parser.add_argument('-qu', '--qq_user', dest='qq_user', type=str, default='', help='用于向 QQ 群发送播报信息的 QQ 账号') 51 | parser.add_argument('-qp', '--qq_pass', dest='qq_pass', type=str, default='', help='用于发送播报信息的 QQ 密码') 52 | return parser.parse_args() 53 | 54 | 55 | def get_args(args) : 56 | if args.git != GIT_CRAWL_PWD : 57 | # Github Action 调用了 -g 参数,若仓库没有设置 secrets.CRAWL_PWD 会赋予为空值 58 | # 导致验证 Github Action 的 secrets.CRAWL_PWD 失败,爬虫进程终止执行 59 | # 目的是在仓库被 Fork 时,可以保护目标站点不被 DDos 60 | exit(0) 61 | 62 | top = args.top or settings.crawler['top'] 63 | auto_commit = args.auto_commit or settings.github['auto_commit'] 64 | gtk = args.gtk or settings.github['gtk'] 65 | mail_smtp = args.mail_smtp or settings.notify['mail_smtp'] 66 | mail_user = args.mail_user or settings.notify['mail_user'] 67 | mail_pass = args.mail_pass or settings.notify['mail_pass'] 68 | qq_user = args.qq_user or settings.notify['qq_user'] 69 | qq_pass = args.qq_pass or settings.notify['qq_pass'] 70 | return [ top, auto_commit, gtk, mail_smtp, mail_user, mail_pass, qq_user, qq_pass ] 71 | 72 | 73 | def init(): 74 | sdbc = SqliteDBC(options=settings.database) 75 | sdbc.exec_script(settings.database['sqlpath']) 76 | 77 | 78 | def main(top, auto_commit, gtk, mail_smtp, mail_user, mail_pass, qq_user, qq_pass): 79 | all_cves = {} 80 | srcs = [ 81 | Cert360(), 82 | Nsfocus(), 83 | QiAnXin(), 84 | RedQueen(), 85 | # AnQuanKe(), # 已经不做 CVE 分析了 86 | #Vas(), 87 | NVD(), 88 | # CNVD(), # 不断升级反爬机制,尊重平台 89 | #CNNVD(), 90 | Tenable() 91 | ] 92 | for src in srcs: 93 | cves = src.cves() 94 | if cves: 95 | to_log(cves) 96 | all_cves[src] = cves 97 | 98 | if all_cves: 99 | page.to_page(top) 100 | mail.to_mail(gtk, all_cves, mail_smtp, mail_user, mail_pass) 101 | qq.to_group(all_cves, qq_user, qq_pass) 102 | wechat.to_wechat(all_cves) 103 | 104 | if auto_commit: 105 | git.auto_commit() 106 | 107 | 108 | def to_log(cves): 109 | for cve in cves : 110 | log.info(cve.to_msg()) 111 | 112 | 113 | 114 | if __name__ == '__main__': 115 | init() 116 | main(*get_args(args())) 117 | 118 | 119 | 120 | 121 | 122 | -------------------------------------------------------------------------------- /recv/mail.dat: -------------------------------------------------------------------------------- 1 | # 接收威胁情报的邮箱地址:每行一个邮箱 2 | # 若你不希望把邮箱列表上传到代码仓库, 3 | # 可以在 recv 目录下创建名为 mail_xxx.dat 的文件名, 例如 mail_work.dat 4 | # 根据 .gitignore 规则,该文件并不会上传到代码仓库,你可在里面设置你的工作邮箱 5 | 6 | threatbroadcast@foxmail.com 7 | 8 | -------------------------------------------------------------------------------- /recv/qq_group.dat: -------------------------------------------------------------------------------- 1 | # 接收威胁情报的 QQ 群号 2 | # 要求发送信息的 QQ 在群内有发言权限 3 | 4 | 283212984 5 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests==2.22.0 2 | GitPython==3.1.7 3 | python-graphql-client==0.3.0 4 | PyExecJS==1.5.1 5 | lxml>=4.6.5 6 | pypdm-db>=1.1.2 7 | pyyaml-erb>=1.0.2 8 | py-color-log>=1.0.2 9 | argparse>=1.4.0 -------------------------------------------------------------------------------- /script/cves-create.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS `t_cves` ( 2 | `s_md5` TEXT(64), 3 | `s_src` TEXT(32), 4 | `s_cves` TEXT(128), 5 | `s_title` TEXT(256), 6 | `s_time` TEXT(20), 7 | `s_info` TEXT(2048), 8 | `s_url` TEXT(256) 9 | ); -------------------------------------------------------------------------------- /script/cves-rollback.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS `t_cves`; -------------------------------------------------------------------------------- /src/bean/cve_info.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/4/25 22:17 5 | # @File : cve_info.py 6 | # ----------------------------------------------- 7 | 8 | 9 | import hashlib 10 | 11 | 12 | class CVEInfo: 13 | 14 | def __init__(self): 15 | self.id = '' 16 | self.src = '' 17 | self.url = '' 18 | self.time = '' 19 | self.title = '' 20 | self.info = '' 21 | self.md5 = '' 22 | 23 | 24 | def is_vaild(self): 25 | return not not self.title 26 | 27 | 28 | def MD5(self): 29 | if not self.md5: 30 | data = '%s%s%s' % (self.id, self.title, self.url) 31 | self.md5 = hashlib.md5(data.encode(encoding='UTF-8')).hexdigest() 32 | return self.md5 33 | 34 | 35 | def to_html(self): 36 | return '
'.join([ 37 | "
==============================================", 38 | "[漏洞来源] %s" % self.src, 39 | "[漏洞编号] %s" % self.id, 40 | "[披露时间] %s" % self.time, 41 | "[漏洞描述] %s" % self.title, 42 | "[相关链接] %s" % (self.url, self.url) 43 | ]) 44 | 45 | 46 | def to_msg(self): 47 | return '\n'.join([ 48 | "\n==============================================", 49 | "[ TITLE ] %s" % self.title, 50 | "[ TIME ] %s" % self.time, 51 | "[ CVE ] %s" % self.id, 52 | "[ SRC ] %s" % self.src, 53 | "[ URL ] %s" % self.url 54 | ]) 55 | 56 | 57 | def __str__(self): 58 | return self.__repr__() 59 | 60 | 61 | def __repr__(self): 62 | return '\n'.join([ 63 | "\n==============================================", 64 | "[ TITLE ] %s" % self.title, 65 | "[ TIME ] %s" % self.time, 66 | "[ CVE ] %s" % self.id, 67 | "[ SRC ] %s" % self.src, 68 | "[ URL ] %s" % self.url, 69 | "[ INFO ] %s" % self.info, 70 | ]) 71 | 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /src/bean/t_cves.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/4/29 23:30 5 | # @File : t_cves.py 6 | # ----------------------------------------------- 7 | # PDM: t_cves 8 | # ----------------------------------------------- 9 | 10 | class TCves: 11 | table_name = "t_cves" 12 | s_md5 = "s_md5" 13 | s_src = "s_src" 14 | s_cves = "s_cves" 15 | s_title = "s_title" 16 | s_time = "s_time" 17 | s_info = "s_info" 18 | s_url = "s_url" 19 | 20 | 21 | def __init__(self): 22 | self.md5 = None 23 | self.src = None 24 | self.cves = None 25 | self.title = None 26 | self.time = None 27 | self.info = None 28 | self.url = None 29 | 30 | 31 | def params(self): 32 | return ( 33 | self.md5, 34 | self.src, 35 | self.cves, 36 | self.title, 37 | self.time, 38 | self.info, 39 | self.url, 40 | ) 41 | 42 | 43 | def __repr__(self): 44 | return "\n".join( 45 | ( 46 | "%s: {" % self.table_name, 47 | "\t%s = %s" % (self.s_md5, self.md5), 48 | "\t%s = %s" % (self.s_src, self.src), 49 | "\t%s = %s" % (self.s_cves, self.cves), 50 | "\t%s = %s" % (self.s_title, self.title), 51 | "\t%s = %s" % (self.s_time, self.time), 52 | "\t%s = %s" % (self.s_info, self.info), 53 | "\t%s = %s" % (self.s_url, self.url), 54 | "}\n" 55 | ) 56 | ) 57 | 58 | 59 | -------------------------------------------------------------------------------- /src/config.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/4/28 21:56 5 | # ----------------------------------------------- 6 | 7 | import os 8 | import erb.yml as yaml 9 | PRJ_DIR = os.path.dirname( 10 | os.path.dirname( 11 | os.path.abspath(__file__) 12 | ) 13 | ) 14 | CHARSET = 'utf-8' 15 | SETTINGS_PATH = '%s/config/settings.yml' % PRJ_DIR 16 | 17 | 18 | class Config : 19 | 20 | def __init__(self, settings_path, charset) -> None: 21 | if os.path.exists(settings_path) : 22 | with open(settings_path, 'r', encoding=charset) as file: 23 | context = yaml.load(file.read()) 24 | self.database = context.get('database') 25 | self.github = context.get('github') 26 | self.crawler = context.get('crawler') 27 | self.notify = context.get('notify') 28 | 29 | 30 | settings = Config(SETTINGS_PATH, CHARSET) -------------------------------------------------------------------------------- /src/crawler/_base_crawler.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/4/25 22:17 5 | # @File : _base_crawler.py 6 | # ----------------------------------------------- 7 | 8 | import os 9 | from abc import ABCMeta, abstractmethod # python不存在抽象类的概念, 需要引入abc模块实现 10 | import src.config as config 11 | from color_log.clog import log 12 | from pypdm.dbc._sqlite import SqliteDBC 13 | from src.bean.t_cves import TCves 14 | from src.dao.t_cves import TCvesDao 15 | 16 | 17 | 18 | class BaseCrawler: 19 | 20 | __metaclass__ = ABCMeta # 定义为抽象类 21 | 22 | def __init__(self, timeout = 60, charset = config.CHARSET): 23 | self.timeout = timeout or 60 24 | self.charset = charset or config.CHARSET 25 | 26 | 27 | @abstractmethod 28 | def NAME_CH(self): 29 | return '未知' 30 | 31 | 32 | @abstractmethod 33 | def NAME_EN(self): 34 | return 'unknow' 35 | 36 | 37 | @abstractmethod 38 | def HOME_PAGE(self): 39 | return 'https://exp-blog.com' 40 | 41 | 42 | def CACHE_PATH(self): 43 | return '%s/cache/%s.dat' % (config.PRJ_DIR, self.NAME_EN()) 44 | 45 | 46 | def headers(self): 47 | return { 48 | 'Accept' : '*/*', 49 | 'Accept-Encoding' : 'gzip, deflate', 50 | 'Accept-Language' : 'zh-CN,zh;q=0.9', 51 | 'Connection' : 'keep-alive', 52 | 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36', 53 | } 54 | 55 | 56 | def cves(self): 57 | log.info('++++++++++++++++++++++++++++++++++++++++++++') 58 | log.info('正在获取 [%s] 威胁情报...' % self.NAME_CH()) 59 | old_cves = self.load_cache() 60 | 61 | try: 62 | new_cves = self.get_cves() 63 | except: 64 | new_cves = [] 65 | log.error('获取 [%s] 威胁情报异常' % self.NAME_CH()) 66 | 67 | dao = TCvesDao() 68 | sdbc = SqliteDBC(options=config.settings.database) 69 | conn = sdbc.conn() 70 | _cves = [] 71 | for cve in new_cves: 72 | if cve.MD5() not in old_cves: 73 | _cves.append(cve) 74 | self.to_cache(cve) 75 | self.to_db(conn, dao, cve) 76 | sdbc.close() 77 | 78 | log.info('得到 [%s] 最新威胁情报 [%s] 条' % (self.NAME_CH(), len(_cves))) 79 | log.info('--------------------------------------------') 80 | return _cves 81 | 82 | 83 | @abstractmethod 84 | def get_cves(self): 85 | # 获取最新的 CVE 信息(由子类爬虫实现) 86 | # TODO in sub class 87 | return [] # CVEInfo 88 | 89 | 90 | def load_cache(self): 91 | if not os.path.exists(self.CACHE_PATH()): 92 | with open(self.CACHE_PATH(), 'w+') as file: 93 | pass # 创建空文件 94 | 95 | lines = [] 96 | with open(self.CACHE_PATH(), 'r+') as file: 97 | lines = file.readlines() 98 | lines = list(map(lambda line: line.strip(), lines)) 99 | 100 | # 缓存超过 200 时,保留最后的 100 条缓存 101 | if len(lines) > 200: 102 | lines = lines[100:] 103 | with open(self.CACHE_PATH(), 'w+') as file: 104 | file.write('\n'.join(lines) + '\n') 105 | return set(lines) 106 | 107 | 108 | def to_cache(self, cve): 109 | with open(self.CACHE_PATH(), 'a+') as file: 110 | file.write(cve.MD5() + '\n') 111 | 112 | 113 | def to_db(self, conn, dao, cve): 114 | tcve = TCves() 115 | tcve.md5 = cve.MD5() 116 | tcve.src = cve.src 117 | tcve.cves = cve.id 118 | tcve.title = cve.title 119 | tcve.info = cve.info 120 | tcve.time = cve.time 121 | tcve.url = cve.url 122 | dao.insert(conn, tcve) 123 | -------------------------------------------------------------------------------- /src/crawler/anquanke.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/4/28 14:34 5 | # @File : anquanke.py 6 | # ----------------------------------------------- 7 | # 安全客:https://www.anquanke.com/vul 8 | # ----------------------------------------------- 9 | 10 | from src.bean.cve_info import CVEInfo 11 | from src.crawler._base_crawler import BaseCrawler 12 | from color_log.clog import log 13 | import time 14 | import requests 15 | import re 16 | 17 | 18 | class AnQuanKe(BaseCrawler): 19 | 20 | def __init__(self): 21 | BaseCrawler.__init__(self) 22 | self.name_ch = '安全客' 23 | self.name_en = 'AnQuanKe' 24 | self.home_page = 'https://www.anquanke.com/vul' 25 | self.url = 'https://www.anquanke.com/vul/' 26 | 27 | 28 | def NAME_CH(self): 29 | return self.name_ch 30 | 31 | 32 | def NAME_EN(self): 33 | return self.name_en 34 | 35 | 36 | def HOME_PAGE(self): 37 | return self.home_page 38 | 39 | 40 | def get_cves(self): 41 | response = requests.get( 42 | self.url, 43 | headers = self.headers(), 44 | timeout = self.timeout 45 | ) 46 | 47 | cves = [] 48 | if response.status_code == 200: 49 | html = response.content.decode(self.charset) 50 | vul_table = re.findall(r'(.*?)', html, re.DOTALL) 51 | if vul_table: 52 | for vul in vul_table: 53 | cve = self.to_cve(vul) 54 | if cve.is_vaild(): 55 | cves.append(cve) 56 | # log.debug(cve) 57 | else: 58 | log.warn('获取 [%s] 威胁情报失败: [HTTP Error %i]' % (self.name_ch, response.status_code)) 59 | return cves 60 | 61 | 62 | def to_cve(self, xml): 63 | cve = CVEInfo() 64 | cve.src = self.NAME_CH() 65 | 66 | rst = re.findall(r'href="/vul/(.*?)">(.*?)', xml, re.DOTALL) 67 | if rst: 68 | cve.url = self.url + rst[0][0] 69 | cve.title = rst[0][1].strip() 70 | 71 | rst = re.findall(r'(CVE-\d+-\d+)', xml) 72 | if rst: 73 | cve.id = rst[0] 74 | 75 | rst = re.findall(r'(\d\d\d\d-\d\d-\d\d)', xml) 76 | if rst: 77 | cve.time = rst[1] + time.strftime(" %H:%M:%S", time.localtime()) 78 | 79 | return cve 80 | 81 | 82 | -------------------------------------------------------------------------------- /src/crawler/cert360.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/4/25 22:17 5 | # @File : cert360.py 6 | # ----------------------------------------------- 7 | # 360:https://cert.360.cn/warning 8 | # ----------------------------------------------- 9 | 10 | from src.bean.cve_info import CVEInfo 11 | from src.crawler._base_crawler import BaseCrawler 12 | from color_log.clog import log 13 | import requests 14 | import json 15 | import re 16 | import time 17 | 18 | 19 | class Cert360(BaseCrawler): 20 | 21 | def __init__(self): 22 | BaseCrawler.__init__(self) 23 | self.name_ch = '360 网络安全响应中心' 24 | self.name_en = 'Cert 360' 25 | self.home_page = 'https://cert.360.cn/warning' 26 | self.url_list = 'https://cert.360.cn/warning/searchbypage' 27 | self.url_cve = 'https://cert.360.cn/warning/detail?id=' 28 | 29 | 30 | def NAME_CH(self): 31 | return self.name_ch 32 | 33 | 34 | def NAME_EN(self): 35 | return self.name_en 36 | 37 | 38 | def HOME_PAGE(self): 39 | return self.home_page 40 | 41 | 42 | def get_cves(self, limit = 6): 43 | params = { 44 | 'length': limit, 45 | 'start' : 0 46 | } 47 | 48 | response = requests.get( 49 | self.url_list, 50 | headers = self.headers(), 51 | params = params, 52 | timeout = self.timeout 53 | ) 54 | 55 | cves = [] 56 | if response.status_code == 200: 57 | json_obj = json.loads(response.text) 58 | for obj in json_obj.get('data'): 59 | cve = self.to_cve(obj) 60 | if cve.is_vaild(): 61 | cves.append(cve) 62 | # log.debug(cve) 63 | else: 64 | log.warn('获取 [%s] 威胁情报失败: [HTTP Error %i]' % (self.NAME_CH(), response.status_code)) 65 | return cves 66 | 67 | 68 | def to_cve(self, json_obj): 69 | cve = CVEInfo() 70 | cve.src = self.NAME_CH() 71 | cve.url = self.url_cve + (json_obj.get('id') or '') 72 | cve.info = (json_obj.get('description') or '').strip().replace('\n\n', '\n') 73 | 74 | seconds = json_obj.get('update_time') or json_obj.get('add_time') or 0 75 | localtime = time.localtime(seconds) 76 | cve.time = time.strftime('%Y-%m-%d %H:%M:%S', localtime) 77 | 78 | title = json_obj.get('title') or '' 79 | cve.title = re.sub(r'CVE-\d+-\d+:', '', title).strip() 80 | 81 | rst = re.findall(r'(CVE-\d+-\d+)', title) 82 | cve.id = rst[0] if rst else '' 83 | return cve 84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /src/crawler/cnnvd.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/12/01 23:21 5 | # @File : cnnvd.py 6 | # ----------------------------------------------- 7 | # cnnvd: http://www.cnnvd.org.cn/ 8 | # ----------------------------------------------- 9 | 10 | from src.bean.cve_info import CVEInfo 11 | from src.crawler._base_crawler import BaseCrawler 12 | from color_log.clog import log 13 | import requests 14 | import re 15 | import time 16 | from lxml import etree 17 | 18 | 19 | class CNNVD(BaseCrawler): 20 | 21 | def __init__(self): 22 | BaseCrawler.__init__(self) 23 | self.name_ch = '国家信息安全漏洞库(CNNVD)' 24 | self.name_en = 'CNNVD' 25 | self.home_page = 'http://www.cnnvd.org.cn/' 26 | self.url_list = 'http://www.cnnvd.org.cn/web/vulnerability/querylist.tag' 27 | self.url_cve = 'http://www.cnnvd.org.cn/web/xxk/ldxqById.tag?CNNVD=' 28 | 29 | 30 | def NAME_CH(self): 31 | return self.name_ch 32 | 33 | 34 | def NAME_EN(self): 35 | return self.name_en 36 | 37 | 38 | def HOME_PAGE(self): 39 | return self.home_page 40 | 41 | 42 | def get_cves(self, limit = 6): 43 | response = requests.get( 44 | self.url_list, 45 | headers = self.headers(), 46 | timeout = self.timeout 47 | ) 48 | response.encoding = 'utf-8' 49 | 50 | cves = [] 51 | if response.status_code == 200: 52 | ids = re.findall(r'ldxqById\.tag\?CNNVD=([^"]+)">', response.text) 53 | for id in ids : 54 | cve = self.to_cve(id) 55 | if cve.is_vaild(): 56 | cves.append(cve) 57 | # log.debug(cve) 58 | else: 59 | log.warn('获取 [%s] 威胁情报失败: [HTTP Error %i]' % (self.NAME_CH(), response.status_code)) 60 | return cves 61 | 62 | 63 | def to_cve(self, id): 64 | cve = CVEInfo() 65 | cve.id = id 66 | cve.src = self.NAME_CH() 67 | cve.url = self.url_cve + id 68 | self.get_cve_info(cve, cve.url) 69 | return cve 70 | 71 | 72 | def get_cve_info(self, cve, url) : 73 | try : 74 | response = requests.get( 75 | url, 76 | headers = self.headers(), 77 | timeout = self.timeout 78 | ) 79 | response.encoding = 'utf-8' 80 | 81 | if response.status_code == 200: 82 | html = etree.HTML(response.text) 83 | body = html.xpath("./body") 84 | div1 = body[0].xpath("./div[contains(@class, 'container') and contains(@class, 'm_t_10')]") 85 | div2 = div1[0].xpath("./div[contains(@class, 'container') and contains(@class, 'm_t_20')]") 86 | div3 = div2[0].xpath("./div[contains(@class, 'fl') and contains(@class, 'w770')]") 87 | div4 = div3[0].xpath("./div[contains(@class, 'detail_xq') and contains(@class, 'w770')]") 88 | title = div4[0].xpath("./h2")[0].text.strip() 89 | cve.title = title 90 | 91 | div5 = div3[0].xpath("./div[@class='d_ldjj']") 92 | p_list = div5[0].xpath("./p[@style='text-indent:2em']") 93 | for p in p_list : 94 | cve.info += p.text.strip() 95 | 96 | cve.id = "%s (%s)" % (cve.id, re.findall(r'cvename\.cgi\?name=([^"]*)"', response.text)[0].strip()) 97 | cve.time = re.findall(r'qstartdateXq=([^"]*)"', response.text)[0].strip() + time.strftime(" %H:%M:%S", time.localtime()) 98 | except : 99 | pass # 漏洞信息页面不存在 100 | 101 | time.sleep(1) 102 | 103 | -------------------------------------------------------------------------------- /src/crawler/cnvd.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/12/01 23:21 5 | # @File : cnvd.py 6 | # ----------------------------------------------- 7 | # cnvd: https://www.cnvd.org.cn/ 8 | # ----------------------------------------------- 9 | 10 | from src.bean.cve_info import CVEInfo 11 | from src.crawler._base_crawler import BaseCrawler 12 | from color_log.clog import log 13 | import requests 14 | from requests.utils import add_dict_to_cookiejar 15 | import execjs 16 | import hashlib 17 | import json 18 | import re 19 | import time 20 | 21 | 22 | class CNVD(BaseCrawler): 23 | 24 | def __init__(self): 25 | BaseCrawler.__init__(self) 26 | self.name_ch = '国家信息安全漏洞共享平台(CNVD)' 27 | self.name_en = 'CNVD' 28 | self.home_page = 'https://www.cnvd.org.cn/' 29 | self.url_list = 'https://www.cnvd.org.cn/flaw/list' 30 | self.url_cve = 'https://www.cnvd.org.cn/flaw/show/' 31 | # https://www.cnvd.org.cn/flaw/typeResult?typeId=30 32 | 33 | self.session = requests.session() 34 | self._set_cookie(self.home_page) 35 | 36 | 37 | def NAME_CH(self): 38 | return self.name_ch 39 | 40 | 41 | def NAME_EN(self): 42 | return self.name_en 43 | 44 | 45 | def HOME_PAGE(self): 46 | return self.home_page 47 | 48 | 49 | # CNVD 采用加速乐反爬机制 50 | # 破解方式参考: 51 | # 两次 JS 动态混淆反爬虫策略导致的 521 响应码,如何破?:https://blog.csdn.net/wojiushiwo945you/article/details/110952579 52 | # 爬虫CNVD构建漏洞库:https://blog.csdn.net/weixin_40502018/article/details/112581719?share_token=236ffb43-0fe7-4d2e-b3e9-0f0163f62558 53 | def _set_cookie(self, url): 54 | response1 = self.session.get(url) 55 | jsl_clearance_s = re.findall(r'cookie=(.*?);location', response1.text)[0] 56 | jsl_clearance_s = str(execjs.eval(jsl_clearance_s)).split('=')[1].split(';')[0] 57 | add_dict_to_cookiejar(self.session.cookies, {'__jsl_clearance_s': jsl_clearance_s}) 58 | 59 | response2 = self.session.get(url) 60 | data = json.loads(re.findall(r';go\((.*?)\)', response2.text)[0]) 61 | jsl_clearance_s = self._get__jsl_clearance_s(data) 62 | add_dict_to_cookiejar(self.session.cookies, {'__jsl_clearance_s': jsl_clearance_s}) 63 | 64 | 65 | def _get__jsl_clearance_s(self, js_script): 66 | """ 67 | 通过分析加密的 js 脚本得到正确 cookie 参数 68 | :param js_script: 加密的 js 脚本 69 | :return: 返回正确 cookie 参数 70 | """ 71 | chars = len(js_script['chars']) 72 | for i in range(chars): 73 | for j in range(chars): 74 | __jsl_clearance_s = js_script['bts'][0] + js_script['chars'][i] + js_script['chars'][j] + js_script['bts'][1] 75 | encrypt = None 76 | if js_script['ha'] == 'md5': 77 | encrypt = hashlib.md5() 78 | elif js_script['ha'] == 'sha1': 79 | encrypt = hashlib.sha1() 80 | elif js_script['ha'] == 'sha256': 81 | encrypt = hashlib.sha256() 82 | encrypt.update(__jsl_clearance_s.encode()) 83 | result = encrypt.hexdigest() 84 | if result == js_script['ct']: 85 | return __jsl_clearance_s 86 | 87 | 88 | def get_cves(self, limit = 6): 89 | params = { 90 | 'length': limit, 91 | 'start' : 0 92 | } 93 | 94 | response = self.session.get( 95 | self.url_list, 96 | params = params, 97 | timeout = self.timeout 98 | ) 99 | response.encoding = 'utf-8' 100 | 101 | cves = [] 102 | if response.status_code == 200: 103 | ids = re.findall(r'\thref="/flaw/show/([^"]+)"', response.text) 104 | for id in ids : 105 | cve = self.to_cve(id) 106 | if cve.is_vaild(): 107 | cves.append(cve) 108 | # log.debug(cve) 109 | else: 110 | log.warn('获取 [%s] 威胁情报失败: [HTTP Error %i]' % (self.NAME_CH(), response.status_code)) 111 | return cves 112 | 113 | 114 | def to_cve(self, id): 115 | cve = CVEInfo() 116 | cve.id = id 117 | cve.src = self.NAME_CH() 118 | cve.url = self.url_cve + id 119 | self.get_cve_info(cve, cve.url) 120 | return cve 121 | 122 | 123 | def get_cve_info(self, cve, url) : 124 | try : 125 | response = self.session.get( 126 | url, 127 | timeout = self.timeout 128 | ) 129 | response.encoding = 'utf-8' 130 | 131 | if response.status_code == 200: 132 | _title = re.findall(r'>(.*?)', response.text)[0].strip() 133 | cve.title = re.sub(r'(CNVD-\d+-\d+)', '', _title).strip() 134 | kvs = re.findall(r'(.*?).*?(.*?)', response.text, re.DOTALL) 135 | for kv in kvs : 136 | key = kv[0].replace('\t', '').strip() 137 | val = kv[1].replace('\t', '').strip() 138 | 139 | if key == 'CVE ID' : 140 | id = re.findall(r'>(.*?)', val)[0].strip() 141 | cve.id = "%s (%s)" % (cve.id, id) 142 | 143 | elif key == '公开日期' : 144 | cve.time = val + time.strftime(" %H:%M:%S", time.localtime()) 145 | 146 | elif key == '漏洞描述' : 147 | cve.info = val.replace('\r', '').replace('\n', '').replace('
', '') 148 | except : 149 | pass # 漏洞信息页面不存在 150 | 151 | time.sleep(1) 152 | 153 | -------------------------------------------------------------------------------- /src/crawler/nsfocus.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/4/25 22:17 5 | # @File : nsfocus.py 6 | # ----------------------------------------------- 7 | # 绿盟:http://www.nsfocus.net/index.php 8 | # ----------------------------------------------- 9 | 10 | from src.bean.cve_info import CVEInfo 11 | from src.crawler._base_crawler import BaseCrawler 12 | from color_log.clog import log 13 | import time 14 | import requests 15 | import re 16 | 17 | 18 | class Nsfocus(BaseCrawler): 19 | 20 | def __init__(self): 21 | BaseCrawler.__init__(self) 22 | self.name_ch = '绿盟' 23 | self.name_en = 'Nsfocus' 24 | self.home_page = 'http://www.nsfocus.net/index.php' 25 | self.url_list = 'http://www.nsfocus.net/index.php' 26 | self.url_cve = 'http://www.nsfocus.net/vulndb/' 27 | 28 | 29 | def NAME_CH(self): 30 | return self.name_ch 31 | 32 | 33 | def NAME_EN(self): 34 | return self.name_en 35 | 36 | 37 | def HOME_PAGE(self): 38 | return self.home_page 39 | 40 | 41 | def get_cves(self): 42 | params = { 43 | 'act': 'sec_bug' 44 | } 45 | 46 | response = requests.get( 47 | self.url_list, 48 | headers = self.headers(), 49 | params = params, 50 | timeout = self.timeout 51 | ) 52 | 53 | cves = [] 54 | if response.status_code == 200: 55 | html = response.content.decode(self.charset) 56 | vul_list = re.findall(r'
(.*?)
', html, re.DOTALL) 57 | if vul_list: 58 | vuls = re.findall(r"
  • (.*?) (.*?)", vul_list[0]) 59 | for vul in vuls: 60 | cve = self.to_cve(vul) 61 | if cve.is_vaild(): 62 | cves.append(cve) 63 | # log.debug(cve) 64 | else: 65 | log.warn('获取 [%s] 威胁情报失败: [HTTP Error %i]' % (self.NAME_CH(), response.status_code)) 66 | return cves 67 | 68 | 69 | def to_cve(self, vul): 70 | cve = CVEInfo() 71 | cve.src = self.NAME_CH() 72 | cve.url = self.url_cve + vul[1] 73 | cve.time = vul[0] + time.strftime(" %H:%M:%S", time.localtime()) 74 | cve.title = re.sub(r'\(CVE-\d+-\d+\)|(CVE-\d+-\d+)', '', vul[2]) 75 | 76 | rst = re.findall(r'(CVE-\d+-\d+)', vul[2]) 77 | cve.id = rst[0] if rst else '' 78 | return cve 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /src/crawler/nvd.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/4/25 22:17 5 | # @File : redqueen.py 6 | # ----------------------------------------------- 7 | # NVD:https://nvd.nist.gov/feeds/xml/cve/misc/nvd-rss-analyzed.xml 8 | # ----------------------------------------------- 9 | 10 | from src.bean.cve_info import CVEInfo 11 | from src.crawler._base_crawler import BaseCrawler 12 | from color_log.clog import log 13 | import requests 14 | import re 15 | from lxml import etree 16 | 17 | 18 | class NVD(BaseCrawler): 19 | 20 | def __init__(self): 21 | BaseCrawler.__init__(self) 22 | self.name_ch = '美国国家漏洞数据库(NVD)' 23 | self.name_en = 'NVD' 24 | self.home_page = 'https://nvd.nist.gov/' 25 | self.url_list = 'https://nvd.nist.gov/feeds/xml/cve/misc/nvd-rss-analyzed.xml' 26 | self.url_cve = 'https://web.nvd.nist.gov/view/vuln/detail?vulnId=' 27 | 28 | 29 | def NAME_CH(self): 30 | return self.name_ch 31 | 32 | 33 | def NAME_EN(self): 34 | return self.name_en 35 | 36 | 37 | def HOME_PAGE(self): 38 | return self.home_page 39 | 40 | 41 | def get_cves(self, limit = 10): 42 | response = requests.get( 43 | self.url_list, 44 | headers = self.headers(), 45 | timeout = self.timeout 46 | ) 47 | 48 | cves = [] 49 | if response.status_code == 200: 50 | data = ''.join(response.text.split('\n')[1:]) 51 | data = re.sub(r'dc:date', 'dc_date', data) 52 | rdf = etree.HTML(data) 53 | items = rdf.xpath("//item") 54 | 55 | cnt = 0 56 | for item in reversed(items) : 57 | cve = self.to_cve(item) 58 | if cve.is_vaild(): 59 | if cnt < limit : 60 | cves.append(cve) 61 | # log.debug(cve) 62 | cnt += 1 63 | else: 64 | log.warn('获取 [%s] 威胁情报失败: [HTTP Error %i]' % (self.NAME_CH(), response.status_code)) 65 | return cves 66 | 67 | 68 | def to_cve(self, item): 69 | cve = CVEInfo() 70 | cve.src = self.NAME_CH() 71 | 72 | _id = item.xpath("./title")[0].text 73 | cve.id = re.sub(r' \(.*?\)', '', _id) 74 | cve.url = self.url_cve + cve.id 75 | 76 | _time = item.xpath("./dc_date")[0].text 77 | cve.time = _time.replace('T', ' ').replace('Z', ' ') 78 | 79 | cve.info = item.xpath("./description")[0].text 80 | cve.title = cve.info 81 | return cve 82 | -------------------------------------------------------------------------------- /src/crawler/qianxin.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/4/25 22:17 5 | # @File : qianxin.py 6 | # ----------------------------------------------- 7 | # 奇安信:https://ti.qianxin.com/advisory/ 8 | # ----------------------------------------------- 9 | 10 | from src.bean.cve_info import CVEInfo 11 | from src.crawler._base_crawler import BaseCrawler 12 | from color_log.clog import log 13 | import requests 14 | import json 15 | import re 16 | 17 | 18 | class QiAnXin(BaseCrawler): 19 | 20 | def __init__(self): 21 | BaseCrawler.__init__(self) 22 | self.name_ch = '奇安信' 23 | self.name_en = 'QiAnXin' 24 | self.home_page = 'https://ti.qianxin.com/advisory/' 25 | self.url = 'https://ti.qianxin.com/advisory/' 26 | 27 | 28 | def NAME_CH(self): 29 | return self.name_ch 30 | 31 | 32 | def NAME_EN(self): 33 | return self.name_en 34 | 35 | 36 | def HOME_PAGE(self): 37 | return self.home_page 38 | 39 | 40 | def get_cves(self): 41 | response = requests.get( 42 | self.url, 43 | headers = self.headers(), 44 | timeout = self.timeout 45 | ) 46 | 47 | cves = [] 48 | if response.status_code == 200: 49 | html = response.content.decode(self.charset) 50 | titles = self.get_titles(html) 51 | json_str = self.to_json(html) 52 | json_obj = json.loads(json_str) 53 | 54 | idx = 0 55 | for obj in json_obj.get('msg'): 56 | cve = self.to_cve(obj, titles[idx]) 57 | idx += 1 58 | if cve.is_vaild(): 59 | cves.append(cve) 60 | # log.debug(cve) 61 | else: 62 | log.warn('获取 [%s] 威胁情报失败: [HTTP Error %i]' % (self.NAME_CH(), response.status_code)) 63 | return cves 64 | 65 | 66 | def get_titles(self, html): 67 | titles = re.findall(r'(.*?)', html, re.DOTALL) 68 | return titles 69 | 70 | 71 | def to_json(self, html): 72 | json_str = '{ "msg": [] }' 73 | rst = re.findall(r'(\{success:e,msg:.*?\],pageTotal)', html, re.DOTALL) 74 | if rst: 75 | json_str = rst[0] 76 | json_str = json_str.replace('"', '') 77 | json_str = json_str.replace(',pageTotal', '}') 78 | json_str = re.sub(r'success:[\w\$]+,', '', json_str) 79 | json_str = re.sub(r'_id:[\w\$]+,', '', json_str) 80 | json_str = re.sub(r'title:[\w\$]+,', '', json_str) 81 | json_str = re.sub(r'category:[\w\$]+,', '', json_str) 82 | json_str = re.sub(r'isPdfArticle:[\w\$]+,', '', json_str) 83 | json_str = re.sub(r'isAdvisorArticle:[\w\$]+,', '', json_str) 84 | json_str = re.sub(r'author:[\w\$]+,', '', json_str) 85 | json_str = re.sub(r'headImg:[\w\$]+,', '', json_str) 86 | json_str = re.sub(r'descImg:[\w\$]+,', '', json_str) 87 | json_str = re.sub(r'pdfFile:[\w\$]+,', '', json_str) 88 | json_str = re.sub(r'iocFile:[\w\$]+,', '', json_str) 89 | json_str = re.sub(r'campaign:[\w\$]+,', '', json_str) 90 | json_str = re.sub(r'degree:[\w\$]+,', '', json_str) 91 | json_str = re.sub(r'area:\[.*?\],', '', json_str) 92 | json_str = re.sub(r'industries:\[.*?\],', '', json_str) 93 | json_str = re.sub(r'aggressor_type:\[.*?\],', '', json_str) 94 | json_str = json_str.replace('msg:', '"msg":') 95 | json_str = json_str.replace('readableId:', '"readableId":"') 96 | json_str = json_str.replace(',content:', '","content":"') 97 | json_str = json_str.replace(',abstract:', '","abstract":"') 98 | json_str = json_str.replace(',tags:', '","tags":"') 99 | json_str = json_str.replace(',publish_time:', '","publish_time":"') 100 | json_str = json_str.replace(',permlink:', '","permlink":"') 101 | json_str = json_str.replace('}', '"}') 102 | json_str = json_str.replace(']"}', ']}') 103 | return json_str 104 | 105 | 106 | def to_cve(self, json_obj, title): 107 | cve = CVEInfo() 108 | cve.src = self.NAME_CH() 109 | cve.url = json_obj.get('permlink') or '' 110 | cve.info = (json_obj.get('abstract') or '').strip().replace('\n\n', '\n') 111 | cve.title = title.strip() 112 | 113 | utc_time = json_obj.get('publish_time') or '' # utc_time to datetime 114 | cve.time = utc_time.replace('T', ' ').replace('.000Z', '') 115 | 116 | content = json_obj.get('content') 117 | rst = re.findall(r'ID()?\n(.*?)', content) 118 | if rst: 119 | if '
    ' in rst[0][1]: 120 | ids = rst[0][1].split('
    ') 121 | else: 122 | ids = rst[0][1].split(' ') 123 | cve.id = ', '.join(ids) 124 | return cve 125 | 126 | 127 | 128 | 129 | -------------------------------------------------------------------------------- /src/crawler/redqueen.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/4/25 22:17 5 | # @File : redqueen.py 6 | # ----------------------------------------------- 7 | # 红后:https://redqueen.tj-un.com/IntelHome.html 8 | # ----------------------------------------------- 9 | 10 | from src.bean.cve_info import CVEInfo 11 | from src.crawler._base_crawler import BaseCrawler 12 | from color_log.clog import log 13 | import requests 14 | import json 15 | import re 16 | 17 | 18 | class RedQueen(BaseCrawler): 19 | 20 | def __init__(self): 21 | BaseCrawler.__init__(self) 22 | self.name_ch = '红后' 23 | self.name_en = 'RedQueen' 24 | self.home_page = 'https://redqueen.tj-un.com/IntelHome.html' 25 | self.url_list = 'https://redqueen.tj-un.com/Json/intelHomeVulnIntelList.json' 26 | self.url_cve = 'https://redqueen.tj-un.com/IntelDetails.html?id=' 27 | 28 | 29 | def NAME_CH(self): 30 | return self.name_ch 31 | 32 | 33 | def NAME_EN(self): 34 | return self.name_en 35 | 36 | 37 | def HOME_PAGE(self): 38 | return self.home_page 39 | 40 | 41 | def to_headers(self): 42 | headers = self.headers() 43 | headers['Host'] = 'redqueen.tj-un.com' 44 | headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8' 45 | return headers 46 | 47 | 48 | def get_cves(self, limit = 10): 49 | data = 'query={ "page": 1, "page_count": %d }' % limit 50 | 51 | response = requests.post( 52 | self.url_list, 53 | headers = self.to_headers(), 54 | data = data, 55 | timeout = self.timeout 56 | ) 57 | 58 | cves = [] 59 | if response.status_code == 200: 60 | json_obj = json.loads(response.text) 61 | for obj in json_obj.get('intgs'): 62 | cve = self.to_cve(obj) 63 | if cve.is_vaild(): 64 | cves.append(cve) 65 | # log.debug(cve) 66 | else: 67 | log.warn('获取 [%s] 威胁情报失败: [HTTP Error %i]' % (self.NAME_CH(), response.status_code)) 68 | return cves 69 | 70 | 71 | def to_cve(self, json_obj): 72 | cve = CVEInfo() 73 | cve.src = self.NAME_CH() 74 | cve.url = self.url_cve + json_obj.get('id') 75 | # cve.time = json_obj.get('pub_time') 76 | cve.time = json_obj.get('upd_time') 77 | 78 | title = json_obj.get('title') 79 | rst = re.findall(r'CVE-\d+-\d+|CNVD-\d+-\d+', title) 80 | cve.id = rst[0] if rst else '' 81 | cve.title = re.sub(r'CVE-\d+-\d+|CNVD-\d+-\d+', '', title).strip() 82 | return cve 83 | -------------------------------------------------------------------------------- /src/crawler/tenable.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/4/25 22:17 5 | # @File : redqueen.py 6 | # ----------------------------------------------- 7 | # Tenable:https://www.tenable.com/cve/feeds?sort=newest 8 | # ----------------------------------------------- 9 | 10 | from src.bean.cve_info import CVEInfo 11 | from src.crawler._base_crawler import BaseCrawler 12 | from color_log.clog import log 13 | import requests 14 | import re 15 | from lxml import etree 16 | from datetime import datetime 17 | 18 | 19 | class Tenable(BaseCrawler): 20 | 21 | def __init__(self): 22 | BaseCrawler.__init__(self) 23 | self.name_ch = 'Tenable (Nessus)' 24 | self.name_en = 'Tenable (Nessus)' 25 | self.home_page = 'https://www.tenable.com/' 26 | self.url = 'https://www.tenable.com/cve/feeds?sort=newest' 27 | 28 | 29 | def NAME_CH(self): 30 | return self.name_ch 31 | 32 | 33 | def NAME_EN(self): 34 | return self.name_en 35 | 36 | 37 | def HOME_PAGE(self): 38 | return self.home_page 39 | 40 | 41 | def get_cves(self, limit = 10): 42 | response = requests.get( 43 | self.url, 44 | headers = self.headers(), 45 | timeout = self.timeout 46 | ) 47 | 48 | cves = [] 49 | if response.status_code == 200: 50 | data = ''.join(response.text.split('\n')[1:]) 51 | rss = etree.XML(data) 52 | items = rss.xpath("//item") 53 | 54 | cnt = 0 55 | for item in items : 56 | cve = self.to_cve(item) 57 | if cve.is_vaild(): 58 | if cnt < limit : 59 | cves.append(cve) 60 | # log.debug(cve) 61 | cnt += 1 62 | else: 63 | log.warn('获取 [%s] 威胁情报失败: [HTTP Error %i]' % (self.NAME_CH(), response.status_code)) 64 | return cves 65 | 66 | 67 | def to_cve(self, item): 68 | cve = CVEInfo() 69 | cve.src = self.NAME_CH() 70 | cve.id = item.xpath("./title")[0].text 71 | cve.url = item.xpath("./link")[0].text 72 | 73 | _time = item.xpath("./pubDate")[0].text 74 | cve.time = datetime.strptime(_time, '%a, %d %b %Y %H:%M:%S GMT') 75 | 76 | _desc = item.xpath("./description")[0].text 77 | _desc = _desc.replace('\r', '').replace('\n', '') 78 | cve.info = re.findall(r'Description\s*

    (.*?)

    ', _desc, re.DOTALL)[0].strip() 79 | cve.title = cve.info 80 | return cve 81 | -------------------------------------------------------------------------------- /src/crawler/vas.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/4/28 14:38 5 | # @File : vas.py 6 | # ----------------------------------------------- 7 | # 斗象:https://vas.riskivy.com/vuln 8 | # ----------------------------------------------- 9 | 10 | from src.bean.cve_info import CVEInfo 11 | from src.crawler._base_crawler import BaseCrawler 12 | from color_log.clog import log 13 | import requests 14 | import json 15 | import re 16 | import time 17 | 18 | 19 | class Vas(BaseCrawler): 20 | 21 | def __init__(self): 22 | BaseCrawler.__init__(self) 23 | self.name_ch = '斗象' 24 | self.name_en = 'vas' 25 | self.home_page = 'https://vas.riskivy.com/vuln' 26 | self.url_list = 'https://console.riskivy.com/vas' 27 | self.url_details = 'https://console.riskivy.com/vas/' 28 | self.url_cve = 'https://vas.riskivy.com/vuln-detail?id=' 29 | 30 | 31 | def NAME_CH(self): 32 | return self.name_ch 33 | 34 | 35 | def NAME_EN(self): 36 | return self.name_en 37 | 38 | 39 | def HOME_PAGE(self): 40 | return self.home_page 41 | 42 | 43 | def get_cves(self, limit = 5): 44 | params = { 45 | 'title': '', 46 | 'cve' : '', 47 | 'cnvd': '', 48 | 'cnnvd': '', 49 | 'order': 'update', 50 | 'has_poc': '', 51 | 'has_repair': '', 52 | 'bug_level': '', 53 | 'page': 1, 54 | 'per-page': limit, 55 | } 56 | 57 | response = requests.get( 58 | self.url_list, 59 | headers = self.headers(), 60 | params = params, 61 | timeout = self.timeout 62 | ) 63 | 64 | cves = [] 65 | if response.status_code == 200: 66 | json_obj = json.loads(response.text) 67 | for obj in json_obj.get('data').get('items'): 68 | cve = self.to_cve(obj) 69 | if cve.is_vaild(): 70 | cves.append(cve) 71 | # log.debug(cve) 72 | else: 73 | log.warn('获取 [%s] 威胁情报失败: [HTTP Error %i]' % (self.NAME_CH(), response.status_code)) 74 | return cves 75 | 76 | 77 | def to_cve(self, json_obj): 78 | cve = CVEInfo() 79 | cve.src = self.NAME_CH() 80 | 81 | id = str(json_obj.get('id')) or '' 82 | cve.url = self.url_cve + id 83 | cve.title = json_obj.get('bug_title') or '' 84 | 85 | seconds = json_obj.get('updated_at') or 0 86 | localtime = time.localtime(seconds) 87 | cve.time = time.strftime('%Y-%m-%d %H:%M:%S', localtime) 88 | 89 | self.get_cve_info(cve, id) 90 | return cve 91 | 92 | 93 | def get_cve_info(self, cve, id): 94 | url = self.url_details + id 95 | response = requests.get( 96 | url, 97 | headers = self.headers(), 98 | timeout = self.timeout 99 | ) 100 | 101 | if response.status_code == 200: 102 | json_obj = json.loads(response.text) 103 | cve.id = json_obj.get('data').get('bug_cve').replace(',', ', ') 104 | cve.info = json_obj.get('data').get('detail').get('bug_description') 105 | cve.info = re.sub(r'<.*?>', '', cve.info) 106 | 107 | time.sleep(0.1) 108 | 109 | -------------------------------------------------------------------------------- /src/dao/_base.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/4/29 23:31 5 | # @File : _base.py 6 | # ----------------------------------------------- 7 | # 数据访问对象:基类 8 | # ----------------------------------------------- 9 | 10 | from color_log.clog import log 11 | 12 | 13 | class BaseDao: 14 | """ 15 | Dao 基类 16 | """ 17 | 18 | # TODO 需子类实现 19 | TABLE_NAME = "" 20 | SQL_COUNT = "" 21 | SQL_TRUNCATE = "" 22 | SQL_INSERT = "" 23 | SQL_DELETE = "" 24 | SQL_UPDATE = "" 25 | SQL_SELECT = "" 26 | CHARSET = "utf-8" 27 | 28 | def __init__(self): 29 | pass 30 | 31 | 32 | def count(self, conn): 33 | """ 34 | 统计行数 35 | :param conn: 数据库连接 36 | :return: 表行数 37 | """ 38 | cnt = 0 39 | try: 40 | cursor = conn.cursor() 41 | cursor.execute(self.SQL_COUNT) 42 | cnt = cursor.fetchone()[0] 43 | cursor.close() 44 | except: 45 | log.error("统计表 [%s] 行数失败" % self.TABLE_NAME) 46 | return cnt 47 | 48 | 49 | def truncate(self, conn): 50 | """ 51 | 清空表 52 | :param conn: 数据库连接 53 | :return: 是否清空成功 54 | """ 55 | is_ok = False 56 | try: 57 | cursor = conn.cursor() 58 | cursor.execute(self.SQL_TRUNCATE) 59 | conn.commit() 60 | cursor.close() 61 | is_ok = True 62 | except: 63 | log.error("清空表 [%s] 失败" % self.TABLE_NAME) 64 | return is_ok 65 | 66 | 67 | def insert(self, conn, bean): 68 | """ 69 | 插入单条数据 70 | :param conn: 数据库连接 71 | :param bean: 数据模型实例 72 | :return: 是否插入成功 73 | """ 74 | is_ok = False 75 | try: 76 | cursor = conn.cursor() 77 | params = bean.params() 78 | cursor.execute(self.SQL_INSERT, params) 79 | conn.commit() 80 | cursor.close() 81 | is_ok = True 82 | except: 83 | log.error("插入数据到表 [%s] 失败" % self.TABLE_NAME) 84 | return is_ok 85 | 86 | 87 | def insert_all(self, conn, beans): 88 | """ 89 | 插入多条数据 90 | :param conn: 数据库连接 91 | :param beans: 数据模型实例队列 92 | :return: 成功插入个数 93 | """ 94 | cnt = 0 95 | try: 96 | cursor = conn.cursor() 97 | for bean in beans: 98 | try: 99 | params = bean.params() 100 | cursor.execute(self.SQL_INSERT, params) 101 | cnt += 1 102 | except: 103 | log.error("插入数据到表 [%s] 失败" % self.TABLE_NAME) 104 | conn.commit() 105 | cursor.close() 106 | except: 107 | log.error("插入数据集到表 [%s] 失败" % self.TABLE_NAME) 108 | return cnt 109 | 110 | 111 | def delete(self, conn, wheres={}): 112 | """ 113 | 删除数据 114 | :param conn: 数据库连接 115 | :param wheres: 条件键值对, 要求键值包含操作符,如: { 'column1 like': 'xyz', 'column2 =': 'abc' } 116 | :return: 是否删除成功 117 | """ 118 | is_ok = False 119 | try: 120 | cursor = conn.cursor() 121 | sql = self._append(self.SQL_DELETE, wheres.keys()) 122 | cursor.execute(sql, wheres.values()) 123 | conn.commit() 124 | cursor.close() 125 | is_ok = True 126 | except: 127 | log.error("从表 [%s] 删除数据失败" % self.TABLE_NAME) 128 | return is_ok 129 | 130 | 131 | def update(self, conn, bean): 132 | """ 133 | 更新数据 134 | :param conn: 数据库连接 135 | :param bean: 数据模型实例 136 | :return: 是否更新成功 137 | """ 138 | is_ok = False 139 | try: 140 | cursor = conn.cursor() 141 | sql = self._append(self.SQL_UPDATE, ["%s = " % bean.i_id]) 142 | params = bean.params() + (bean.id,) 143 | cursor.execute(sql, params) 144 | conn.commit() 145 | cursor.close() 146 | is_ok = True 147 | except: 148 | log.error("更新数据到表 [%s] 失败" % self.TABLE_NAME) 149 | return is_ok 150 | 151 | 152 | def query_all(self, conn): 153 | """ 154 | 查询表中所有数据 155 | :param conn: 数据库连接 156 | :return: 数据模型实例队列(失败返回 [] ,不会为 None) 157 | """ 158 | return self.query_some(conn) 159 | 160 | 161 | def query_some(self, conn, wheres={}): 162 | """ 163 | 查询表中部分数据 164 | :param conn: 数据库连接 165 | :param wheres: 条件键值对, 要求键值包含操作符,如: { 'column1 like': 'xyz', 'column2 =': 'abc' } 166 | :return: 数据模型实例队列(失败返回 [] ,不会为 None) 167 | """ 168 | beans = [] 169 | try: 170 | cursor = conn.cursor() 171 | sql = self._append(self.SQL_SELECT, wheres.keys()) 172 | cursor.execute(sql, wheres.values()) 173 | rows = cursor.fetchall() 174 | for row in rows: 175 | bean = self._to_bean(row) 176 | beans.append(bean) 177 | cursor.close() 178 | except: 179 | log.error("从表 [%s] 查询数据失败" % self.TABLE_NAME) 180 | return beans 181 | 182 | 183 | def query_one(self, conn, wheres={}): 184 | """ 185 | 查询表中一条数据 186 | :param conn: 数据库连接 187 | :param wheres: 条件键值对, 要求键值包含操作符,如: { 'column1 like': 'xyz', 'column2 =': 'abc' } 188 | :return: 数据模型实例队列(若多个满足则返回第 1 个,没有满足则返回 None) 189 | """ 190 | bean = None 191 | try: 192 | cursor = conn.cursor() 193 | sql = self._append(self.SQL_SELECT, wheres.keys()) 194 | cursor.execute(sql, wheres.values()) 195 | row = cursor.fetchone() 196 | bean = self._to_bean(row) 197 | conn.commit() 198 | cursor.close() 199 | except: 200 | log.error("从表 [%s] 查询数据失败" % self.TABLE_NAME) 201 | return bean 202 | 203 | 204 | def _append(self, sql, keys): 205 | """ 206 | 追加 where 条件到 sql, 条件之间只为 and 关系(目的只是支持简单的数据库操作) 207 | :param sql: 语句 208 | :param keys: 条件键值集合, 要求键值包含操作符,如: [ 'column1 like', 'column2 =' ] 209 | :return: 追加 where 条件后的 sql 210 | """ 211 | _sql = sql 212 | if keys: 213 | for key in keys: 214 | _sql = " ".join((_sql, "and", key, " ?")) # ? 是 sql 占位符,目的是防注入 215 | return _sql 216 | 217 | 218 | def _to_bean(self, row): 219 | """ 220 | 把数据库查询的单行结果转换成模型实例对象 221 | :param row: 单行查询结果 222 | :return: 模型实例对象 223 | """ 224 | # 需子类实现 225 | return row 226 | 227 | 228 | def _to_val(self, row, idx): 229 | """ 230 | 把 unicode 编码的字符串转换成 utf8 231 | :param row: 行对象 232 | :param idx: 列索引 233 | :return: 列值(utf8 编码) 234 | """ 235 | val = None 236 | try: 237 | val = row[idx] 238 | if val is not None and isinstance(val, unicode): 239 | val = val.encode(self.CHARSET) 240 | except: 241 | pass 242 | return val 243 | 244 | -------------------------------------------------------------------------------- /src/dao/t_cves.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/4/29 23:32 5 | # @File : t_cves.py 6 | # ----------------------------------------------- 7 | # DAO: t_cves 8 | # ----------------------------------------------- 9 | 10 | from src.bean.t_cves import TCves 11 | from src.dao._base import BaseDao 12 | 13 | 14 | class TCvesDao(BaseDao): 15 | 16 | TABLE_NAME = "t_cves" 17 | SQL_COUNT = "select count(1) from t_cves" 18 | SQL_TRUNCATE = "truncate table t_cves" 19 | SQL_INSERT = "insert into t_cves(s_md5, s_src, s_cves, s_title, s_time, s_info, s_url) values (?, ?, ?, ?, ?, ?, ?)" 20 | SQL_DELETE = "delete from t_cves where 1 = 1 " 21 | SQL_UPDATE = "update t_cves set s_md5 = ?, s_src = ?, s_cves = ?, s_title = ?, s_time = ?, s_info = ?, s_url = ? where 1 = 1 " 22 | SQL_SELECT = "select s_md5, s_src, s_cves, s_title, s_time, s_info, s_url from t_cves where 1 = 1 " 23 | 24 | 25 | def __init__(self): 26 | BaseDao.__init__(self) 27 | 28 | 29 | def _to_bean(self, row): 30 | bean = None 31 | if row: 32 | bean = TCves() 33 | bean.md5 = self._to_val(row, 0) 34 | bean.src = self._to_val(row, 1) 35 | bean.cves = self._to_val(row, 2) 36 | bean.title = self._to_val(row, 3) 37 | bean.time = self._to_val(row, 4) 38 | bean.info = self._to_val(row, 5) 39 | bean.url = self._to_val(row, 6) 40 | return bean 41 | 42 | -------------------------------------------------------------------------------- /src/notice/mail.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/4/30 23:29 5 | # ----------------------------------------------- 6 | # 通过邮件发送威胁情报 7 | # ----------------------------------------------- 8 | 9 | import os 10 | import re 11 | import smtplib 12 | from email.mime.text import MIMEText 13 | from email.header import Header 14 | import src.config as config 15 | from color_log.clog import log 16 | from src.utils import _git 17 | 18 | MAIL_TPL_PATH = '%s/tpl/mail.tpl' % config.PRJ_DIR 19 | MAIL_RECV_DIR = '%s/recv' % config.PRJ_DIR 20 | 21 | MAIL_CONTENT_CACHE = '%s/cache/mail_content.dat' % config.PRJ_DIR 22 | MAIL_RECV_CACHE = '%s/cache/mail_recvs.dat' % config.PRJ_DIR 23 | 24 | 25 | def to_mail(gtk, cves, smtp, sender, password): 26 | content = format_content(cves) 27 | receivers = load_local_receivers() 28 | if gtk: 29 | log.info('[邮件] 正在通过 Github Actions 推送威胁情报...') 30 | recvs = load_issue_receivers(gtk) 31 | recvs.update(receivers) 32 | to_cache(','.join(recvs), MAIL_RECV_CACHE) 33 | to_cache(content, MAIL_CONTENT_CACHE) 34 | 35 | else: 36 | log.info('[邮件] 正在推送威胁情报...') 37 | email = MIMEText(content, 'html', config.CHARSET) # 以 html 格式发送邮件内容 38 | email['From'] = sender 39 | email['To'] = ', '.join(receivers) # 此处收件人列表必须为逗号分隔的 str 40 | log.info('[邮件] 收件人清单: %s' % receivers) 41 | subject = '威胁情报播报' 42 | email['Subject'] = Header(subject, 'utf-8') 43 | 44 | try: 45 | smtpObj = smtplib.SMTP(smtp) 46 | smtpObj.login(sender, password) 47 | smtpObj.sendmail(sender, receivers, email.as_string()) # 此处收件人列表必须为 list 48 | log.info('[邮件] 推送威胁情报成功') 49 | except: 50 | log.error('[邮件] 推送威胁情报失败') 51 | 52 | 53 | def format_content(cves): 54 | src_tpl = '
  • %(cnt)d条由 [%(src)s] 提供
  • ' 55 | mail_tpl = ''' 56 |

    发现最新威胁情报%(total)d条:

    57 |
      58 | %(src_infos)s 59 |
    60 |

    详细漏洞清单如下:

    61 |
    62 | %(cve_infos)s 63 | 64 |

    65 | ++++++++++++++++++++++++++++++++++++++++++++++ 66 |
    67 | 【情报收集与播报支持】 https://lyy289065406.github.io/threat-broadcast/ 68 | ''' 69 | src_infos = [] 70 | cve_infos = [] 71 | total = 0 72 | for src, _cves in cves.items(): 73 | cnt = len(_cves) 74 | total += cnt 75 | src_infos.append(src_tpl % { 76 | 'cnt': cnt, 77 | 'url': src.HOME_PAGE(), 78 | 'src': src.NAME_CH() 79 | }) 80 | for cve in _cves: 81 | cve_infos.append(cve.to_html()) 82 | 83 | content = mail_tpl % { 84 | 'total': total, 85 | 'src_infos': '\n'.join(src_infos), 86 | 'cve_infos': '\n'.join(cve_infos) 87 | } 88 | return content 89 | 90 | 91 | def load_local_receivers(): 92 | recvs = set() 93 | for dirPath, dirNames, fileNames in os.walk(MAIL_RECV_DIR): 94 | for fileName in fileNames: 95 | if fileName.startswith('mail') and fileName.endswith('.dat'): 96 | filePath = '%s/%s' % (MAIL_RECV_DIR, fileName) 97 | with open(filePath, 'r', encoding=config.CHARSET) as file: 98 | lines = file.readlines() 99 | for line in lines: 100 | line = line.strip() 101 | if (not line) or line.startswith('#'): 102 | continue 103 | recvs.add(line) 104 | return list(recvs) 105 | 106 | 107 | def load_issue_receivers(gtk): 108 | recvs = set() 109 | try: 110 | issues = _git.query_issues(gtk) 111 | for issue in issues : 112 | ptn = re.compile(r'([a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+)') 113 | emails = ptn.findall(issue) 114 | for email in emails: 115 | recvs.add(email[0]) 116 | except: 117 | log.error('获取 Issue 的邮箱失败(国内 GraphQL 接口不稳定)') 118 | return recvs 119 | 120 | 121 | def to_cache(date, filepath): 122 | with open(filepath, 'w+', encoding=config.CHARSET) as file: 123 | file.write(date) 124 | -------------------------------------------------------------------------------- /src/notice/page.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/4/30 9:37 5 | # @File : page.py 6 | # ----------------------------------------------- 7 | # 从数据库读取最新 CVE 生成 GitHub 播报页面 8 | # ----------------------------------------------- 9 | 10 | import time 11 | from datetime import datetime, timedelta 12 | import src.config as config 13 | from color_log.clog import log 14 | from pypdm.dbc._sqlite import SqliteDBC 15 | from src.bean.t_cves import TCves 16 | from src.dao.t_cves import TCvesDao 17 | 18 | HTML_PATH = '%s/docs/index.html' % config.PRJ_DIR 19 | HTML_TPL_PATH = '%s/tpl/html.tpl' % config.PRJ_DIR 20 | TABLE_TPL_PATH = '%s/tpl/table.tpl' % config.PRJ_DIR 21 | ROW_TPL_PATH = '%s/tpl/row.tpl' % config.PRJ_DIR 22 | 23 | 24 | def to_page(top_limit = 10): 25 | today = time.strftime('%Y-%m-%d', time.localtime(time.time())) 26 | yesterday = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d') 27 | tormorrow = (datetime.now() + timedelta(days=1)).strftime('%Y-%m-%d') 28 | 29 | html_tpl, table_tpl, row_tpl = load_tpl() 30 | sdbc = SqliteDBC(options=config.settings.database) 31 | conn = sdbc.conn() 32 | 33 | tables = [] 34 | srcs = query_srcs(conn) 35 | for src in srcs: 36 | cves = query_cves(conn, src, top_limit) 37 | 38 | rows = [] 39 | for cve in cves: 40 | row = row_tpl % { 41 | 'md5': cve.md5, 42 | 'id': cve.cves, 43 | 'time': cve.time, 44 | 'new_flag': ' ' if (cve.time.startswith(today) or cve.time.startswith(yesterday) or cve.time.startswith(tormorrow)) else '', 45 | 'title': cve.title, 46 | 'url': cve.url 47 | } 48 | rows.append(row) 49 | 50 | table = table_tpl % { 51 | 'src': cves[0].src, 52 | 'top': top_limit, 53 | 'rows': '\n'.join(rows) 54 | } 55 | tables.append(table) 56 | 57 | html = html_tpl % { 58 | 'datetime': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) , 59 | 'table': '\n\n'.join(tables) 60 | } 61 | sdbc.close() 62 | 63 | create_html(html) 64 | 65 | 66 | 67 | def load_tpl(): 68 | with open(HTML_TPL_PATH, 'r', encoding=config.CHARSET) as file: 69 | html_tpl = file.read() 70 | 71 | with open(TABLE_TPL_PATH, 'r', encoding=config.CHARSET) as file: 72 | table_tpl = file.read() 73 | 74 | with open(ROW_TPL_PATH, 'r', encoding=config.CHARSET) as file: 75 | row_tpl = file.read() 76 | 77 | return html_tpl, table_tpl, row_tpl 78 | 79 | 80 | 81 | def create_html(html): 82 | with open(HTML_PATH, 'w', encoding=config.CHARSET) as file: 83 | file.write(html) 84 | 85 | 86 | 87 | def query_srcs(conn): 88 | sql = 'select %s from %s group by %s' % (TCves.s_src, TCves.table_name, TCves.s_src) 89 | srcs = [] 90 | try: 91 | cursor = conn.cursor() 92 | cursor.execute(sql) 93 | rows = cursor.fetchall() 94 | for row in rows: 95 | srcs.append(row[0]) 96 | cursor.close() 97 | except: 98 | log.error("从表 [%s] 查询数据失败" % TCves.table_name) 99 | return srcs 100 | 101 | 102 | 103 | def query_cves(conn, src, limit): 104 | dao = TCvesDao() 105 | where = "and %s = '%s' order by %s desc limit %d" % (TCves.s_src, src, TCves.s_time, limit) 106 | sql = TCvesDao.SQL_SELECT + where 107 | beans = [] 108 | try: 109 | cursor = conn.cursor() 110 | cursor.execute(sql) 111 | rows = cursor.fetchall() 112 | for row in rows: 113 | bean = dao._to_bean(row) 114 | beans.append(bean) 115 | cursor.close() 116 | except: 117 | log.error("从表 [%s] 查询数据失败" % TCves.table_name) 118 | return beans 119 | -------------------------------------------------------------------------------- /src/notice/qq.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/5/1 0:37 5 | # @File : qq.py 6 | # ----------------------------------------------- 7 | # 通过 QQ 发送威胁情报 8 | # ----------------------------------------------- 9 | 10 | 11 | 12 | def to_group(cves, username, password): 13 | pass -------------------------------------------------------------------------------- /src/notice/wechat.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/5/2 14:53 5 | # @File : wechat.py 6 | # ----------------------------------------------- 7 | # 通过 微信公众号 发送威胁情报 8 | # ----------------------------------------------- 9 | 10 | def to_wechat(cves): 11 | pass 12 | -------------------------------------------------------------------------------- /src/utils/_git.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Author : EXP 4 | # @Time : 2020/5/1 22:31 5 | # @File : _git.py 6 | # ----------------------------------------------- 7 | # git 自动提交变更 8 | # ----------------------------------------------- 9 | 10 | import time 11 | import git 12 | from python_graphql_client import GraphqlClient 13 | import src.config as config 14 | from color_log.clog import log 15 | 16 | 17 | 18 | # 需要手动把仓库的 HTTPS 协议修改成 SSH 19 | # git remote set-url origin git@github.com:lyy289065406/threat-broadcast.git 20 | def auto_commit(): 21 | log.info('正在提交变更...') 22 | try: 23 | repo = git.Repo(config.PRJ_DIR) 24 | repo.git.add('*') 25 | repo.git.commit(m='[Threat-Broadcast] %s' % time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) 26 | repo.git.push() 27 | log.info('提交变更成功') 28 | 29 | except: 30 | log.error('提交变更失败') 31 | 32 | 33 | 34 | # 通过 GraphQL 接口查询所有 Issue 标题 35 | # https://developer.github.com/v4/object/repository/ 36 | # issues (IssueConnection!) 37 | def query_issues(github_token, owner=config.settings.github['owner'], repo=config.settings.github['repo'], iter=100): 38 | titles = [] 39 | client = GraphqlClient(endpoint=config.settings.github['graphql']) 40 | has_next_page = True 41 | next_cursor = None 42 | while has_next_page: 43 | data = client.execute( 44 | query=_to_graphql(next_cursor, owner, repo, iter), 45 | headers={ "Authorization": "Bearer {}".format(github_token) }, 46 | ) 47 | # log.debug(json.dumps(data)) 48 | 49 | issues = data["data"]["repository"]["issues"] 50 | for issue in issues["edges"] : 51 | is_closed = issue["node"]["closed"] 52 | if not is_closed : 53 | title = issue["node"]["title"] 54 | titles.append(title) 55 | 56 | has_next_page = issues["pageInfo"]["hasNextPage"] 57 | next_cursor = issues["pageInfo"]["endCursor"] 58 | return titles 59 | 60 | 61 | 62 | def _to_graphql(next_cursor, owner, repo, iter): 63 | return (""" 64 | query { 65 | repository(owner: "%s", name: "%s") { 66 | issues(orderBy:{field: UPDATED_AT, direction: DESC}, labels: null, first: %i, after: NEXT) { 67 | edges { 68 | node { 69 | title 70 | closed 71 | } 72 | } 73 | pageInfo { 74 | hasNextPage 75 | endCursor 76 | } 77 | } 78 | } 79 | } 80 | """ % (owner, repo, iter)).replace( 81 | "NEXT", '"{}"'.format(next_cursor) if next_cursor else "null" 82 | ) -------------------------------------------------------------------------------- /tpl/html.tpl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 威胁情报自动播报-渊龙Sec安全团队 12 | 13 | 14 | 15 | 16 |
    17 |
    18 |

    渊龙Sec安全团队 | 威胁情报播报-开源项目

    19 |
    20 | 21 | %(table)s 22 | 23 |
    24 | 25 |
    26 |
    27 |
    28 | 29 |

    欢迎关注我们团队!

    30 |
    31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 |
    44 |
    45 | 46 | 47 | -------------------------------------------------------------------------------- /tpl/row.tpl: -------------------------------------------------------------------------------- 1 | 2 | %(md5)s 3 | %(id)s 4 | %(time)s%(new_flag)s 5 | %(title)s 6 | 详情 7 | 8 | -------------------------------------------------------------------------------- /tpl/table.tpl: -------------------------------------------------------------------------------- 1 |
    2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | %(rows)s 12 | 13 |
    %(src)s [TOP %(top)d]CVESTIMETITLEURL
    14 |
    15 | 16 |
    --------------------------------------------------------------------------------